罪恶克星 发表于 2024-8-15 18:06:04

Java面试题--分布式锁

分布式锁

你说一下什么是分布式锁

分布式锁是在分布式/集群情况中办理多线程并发造成的一系列数据安全标题.所用到的锁就是分布式锁,这种锁必要被多个应用共享才可以,通常利用Redis和zookeeper来实现。
分布式锁有哪些办理方案

常用的三种方案

基于数据库实现:通常基于主键,或者唯一索引来实现分布式锁,但是性能比较差,一样平常不建议利用
基于Redis :可以利用setnx来加锁 ,但是必要设置锁的主动删除来防止死锁,所以要联合expire利用.为了保证setnx和expire两个命令的原子性,可以利用set命令组合。
别的释放锁在finallly中调用del删除锁,而删除锁前必要判断该锁是否是当前线程加的锁以免误删除锁,必要通过get获取锁然后进行判断,但是必要保证get判断或和del删除锁的原子性,可以利用LUA脚本实现。
总之自己封装Redis的分布式锁是很麻烦的,我们可以利用Redissoin来实现分布式锁,Redissoin已经封装好了。
基于zookeeper : 利用临时顺序节点实现,线程进来都去创建临时顺序节点,第一个节点的创建线程获取到锁,后面的节点监听自己的上一个节点的删除变乱,如果第一个节点被删除,释放锁第二个节点就成为第一个节点,获取到锁。
在项目中可以利用curator,这个是Apache封装好的基于zookeeper的分布式锁方案。

Redis怎样实现分布式锁,用什么命令

可以利用setnx来加锁 ,但是必要设置锁的主动删除来防止死锁,所以要联合expire利用.为了保证setnx和expire两个命令的原子性,可以利用set命令组合。
Redis实现分布式锁可能会出现什么标题,怎样办理

添加锁和设置逾期时间可以利用set命令进行组合,达到原子性加锁
必要用lua办理删除和判断锁的原子性,否则可能会删除掉别人的锁。
Redis集群情况中,redis节点挂掉可能会导致加锁失败,可以利用Redisson的红锁来办理。
了解Redission的看门狗原理吗?

Redisson对分布式锁进行了封装,对于锁超时标题,它提供了看门狗进行锁时间的续期,底层利用了定时任务每10s检查一下,如果业务还未执行完成,未释放锁,就进行超时时间续期。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java面试题--分布式锁