阿里巴巴-蚂蚁金服JAVA高级面试题

阿里巴巴-蚂蚁金服

1. 说说三种分布式锁?

1 、Zookeeper:基于zookeeper瞬时有序节点实现的分布式锁,其主要逻辑如下(该图来⾃自于IBM⽹网站)。⼤大致思想即为:每个客户端对
某个功能加锁时,在zookeeper上的与该功能对应的指定节点的⽬目录下,⽣生成⼀一个唯⼀一的瞬时有序节点。判断是否获取锁的⽅方式很简单,只需要判断
有序节点中序号最⼩小的⼀一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁⽆无法释放,⽽而产⽣生的死锁问题。

2 、优点

锁安全性⾼高,zk可持久化,且能实时监听获取锁的客户端状态。⼀一旦客户端宕机,则瞬时节点随之消失,zk因⽽而能第
⼀一时间释放锁。这也省去了了⽤用分布式缓存实现锁的过程中需要加⼊入超时时间判断的这⼀一逻辑。
3 、缺点
性能开销⽐比较⾼高。因为其需要动态产⽣生、销毁瞬时节点来实现锁功能。所以不不太适合直接提供给⾼高并发的场景使⽤用。
4 、实现
可以直接采⽤用zookeeper第三⽅方库curator即可⽅方便便地实现分布式锁。
5 、适⽤用场景
对可靠性要求⾮非常⾼高,且并发程度不不⾼高的场景下使⽤用。如核⼼心数据的定时全量量/增量量同步等。

2 、memcached:memcached带有add函数,利利⽤用add函数的特性即可实现分布式锁。add和set的区别在于:如果多线程并发set,则每

个set都会成功,但最后存储的值以最后的set的线程为准。⽽而add的话则相反,add会添加第⼀一个到达的值,并返回true,后续的添加则都会返回
false。利利⽤用该点即可很轻松地实现分布式锁。
2 、优点
并发⾼高效
3 、缺点
memcached采⽤用列列⼊入LRU置换策略略,所以如果内存不不够,可能导致缓存中的锁信息丢失。
memcached⽆无法持久化,⼀一旦重启,将导致信息丢失。
4 、使⽤用场景
⾼高并发场景。需要 1)加上超时时间避免死锁; 2)提供⾜足够⽀支撑锁服务的内存空间; 3)稳定的集群化管理理。
3 、redis:redis分布式锁即可以结合zk分布式锁锁⾼高度安全和memcached并发场景下效率很好的优点,其实现⽅方式和memcached类似,
采⽤用setnx即可实现。需要注意的是,这⾥里里的redis也需要设置超时时间。以避免死锁。可以利利⽤用jedis客户端实现。

1 ICacheKey cacheKey = new ConcurrentCacheKey(key, type);
2 return RedisDao.setnx(cacheKey, "1");
© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发
程序员吾非同的头像-程序员知识精选

昵称

取消
昵称表情代码图片