网站上那些兼职网页怎么做,购物网站 后台模板,快速赚钱软件,公司制作网站价格表一.为什么要使用分布式锁#xff1f;
传统的互斥锁synchronized只能作用于同一台虚拟机上的线程#xff0c;在使用服务器集群部署的情况下#xff0c;互斥锁就会失效#xff0c;因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。
二.redis的分布式锁是如何…一.为什么要使用分布式锁
传统的互斥锁synchronized只能作用于同一台虚拟机上的线程在使用服务器集群部署的情况下互斥锁就会失效因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。
二.redis的分布式锁是如何实现的
1.通常采用redis的一个框架redisson去使用分布式锁
2.redisson的分布式锁底层是基于setnx和lua脚本实现的
1setnxset if not exists由于redis是单线程的因此用了该命令后只能有一个客户端可以对该key设置值在key没有过期或被删除的情况下其他客户端是不能修改这个key的。
2lua脚本加锁、设置过期时间等操作都是通过lua脚本完成的lua脚本会调用redis的命令去完成操作通过lua脚本可以保证多条命令执行的原子性。
三.redisson实现的分布式锁如何合理控制锁的有效时长
1.redisson的分布式锁引入了WatchDog(看门狗)机制当一个线程获得分布式锁之后系统每隔一段时间就会去检查该线程是否还持有锁(默认是每10秒检查一次)如果线程还持有锁则为其延长锁的持有时间等到业务完成后线程自己释放锁即可
2.如果在线程持有分布式锁期间redis宕机此时WatchDog机制也会随着redis宕机而崩掉则线程会在本次持有时间结束后释放锁这样就避免了死锁的发生
3.在线程1持有锁期间若有线程2也要申请互斥锁则线程2会不断尝试获取锁直到线程1释放锁线程2获取锁或者超过了最大等待时间放弃获取锁。
四.redisson实现的分布式锁可以重入吗
1.重入是指任意线程获取锁之后能够再次获取锁而不会被阻塞。
2.答
1redisson实现的分布式锁可以重入这个功能可以防止死锁的发生
2这个重入就是在内部判断该线程是否持有锁如果持有锁则对该线程的重入次数进行计数当线程释放锁则计数减1
3对重入进行计数存储数据时是通过hash结构存储的大key根据业务定制小key是当前线程的唯一标识value是当前线程重入的次数
五.redisson实现的分布式锁能解决主从一致性的问题吗
1.redisson实现的分布式锁不能解决主从一致性的问题假设线程1加锁成功master节点还未将这一数据同步到slave节点就宕机了那么线程1的加标识将丢失
2.主从一致性问题也可以通过使用redisson提供的红锁来解决红锁要求每次加锁至少要在一半以上的redis实例上创建锁但使用红锁会造成性能低下的问题
3.如果业务中必须要保证数据的强一致性建议采用zookeeper实现的分布式锁