Java后端
·2025-06-12Day 6
每天学完累了就像休息,总是忘了打卡。。。
✅ 今天做了:
面试鸭:
1.HashTable,HashMap,TreeMap的区别?
HashTable线程安全,不可存入null的key或value,比较古老,性能不好。
HashMap非线程安全,可存入一个null的key和多个null的value,多线程可用concurrentHashMap
TreeMap非线程安全,底层由红黑树实现,支持key的自然排序或者自定义排序,不可存入null的key,但可存入null的value
2.Redis如何实现分布式锁
Redis通过setnx和Lua脚本实现分布式锁,上锁通过setnx获取锁,并设置过期时间,解锁通过lua脚本实现,解锁时还需要判断锁是否是自己的,避免释放别人的锁。
Redis设置锁的过期时间要合理,即不能太长,占用资源,也不能太短,业务还未执行结束就提前释放。
并且,在主从模式下,如果主节点获取锁,在还未进行主从同步时,就宕机了,哨兵选举出新的主节点,由于没有主从同步,新的主节点又创建了锁,而此时主节点恢复了,此时就出现了两把锁,可能造成数据不一致。
Redis为了解决这一问题,推出了红锁。
红锁的实现基于多台Redis,客户端获取锁,需要向所有Redis发送上锁请求,只有当过半的Redis同意上锁,才可以上锁,否则获取锁失败。但是红锁开发成本较高。
手写RPC框架-负载均衡
在之前的代码中,获取服务,直接从serverList中get(0),获取第一个服务,然后直接调用,而经过增加负载均衡服务,可以从serverList中选择一个调用。
随机负载:创建一个随机数,每次都从serverList中随机获取一个返回。
轮询负载:创建一个轮询数,每次都从serverLIst中获取轮询id对应的数据,轮询数+1。
Hash一致负载:将Hash值空间划分成一个圆环,所有服务节点都映射在环的某个位置,每个请求根据哈希值,也映射在环的某个位置,然后顺时针寻找第一个哈希值大于该哈希值的节点,将请求路由发送到该节点。
Hash一致的优点是,就算某个节点宕机了,请求仍然可以发送到其他节点。
但是Hash一致存在一个问题,那就是如果服务节点过少,可能造成资源分配不均匀的问题,所以同一个服务可以映射在环的多个哈希值节点位置。
然后在Rpcconfig创建属性,添加默认负载均衡机制。在invoke调用服务时添加负载均衡机制。
太伤心了,前两天在写自定义协议,很难,写了一天,到最后程序一直出错,就是找不到问题在哪里,不得已直接copy鱼皮的代码,发现还是存在同样的问题,compeleteFuture的get方法阻塞获取返回结果,一直获取不到,不知道怎么弄,只好把代码恢复了,白写了,只能等其他写完后,再去琢磨琢磨了,哭了
4
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
