Redis-5 分布式锁

一.为什么要使用分布式锁?

传统的互斥锁synchronized只能作用于同一台虚拟机上的线程,在使用服务器集群部署的情况下,互斥锁就会失效,因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。

二.redis的分布式锁是如何实现的?

1.通常采用redis的一个框架redisson去使用分布式锁

2.redisson的分布式锁底层是基于setnx和lua脚本实现的

(1)setnx:set if not exists,由于redis是单线程的,因此用了该命令后只能有一个客户端可以对该key设置值;在key没有过期或被删除的情况下,其他客户端是不能修改这个key的。

(2)lua脚本:加锁、设置过期时间等操作都是通过lua脚本完成的,lua脚本会调用redis的命令去完成操作,通过lua脚本可以保证多条命令执行的原子性。

三.redisson实现的分布式锁如何合理控制锁的有效时长?

1.redisson的分布式锁引入了WatchDog(看门狗)机制:当一个线程获得分布式锁之后,系统每隔一段时间就会去检查该线程是否还持有锁(默认是每10秒检查一次),如果线程还持有锁,则为其延长锁的持有时间,等到业务完成后线程自己释放锁即可

2.如果在线程持有分布式锁期间redis宕机,此时WatchDog机制也会随着redis宕机而崩掉,则线程会在本次持有时间结束后释放锁,这样就避免了死锁的发生

3.在线程1持有锁期间,若有线程2也要申请互斥锁,则线程2会:不断尝试获取锁,直到线程1释放锁线程2获取锁;或者超过了最大等待时间,放弃获取锁。

四.redisson实现的分布式锁可以重入吗?

1.重入:是指任意线程获取锁之后能够再次获取锁而不会被阻塞。

2.答:

(1)redisson实现的分布式锁可以重入,这个功能可以防止死锁的发生

(2)这个重入就是在内部判断该线程是否持有锁,如果持有锁则对该线程的重入次数进行计数,当线程释放锁则计数减1

(3)对重入进行计数,存储数据时是通过hash结构存储的,大key根据业务定制,小key是当前线程的唯一标识,value是当前线程重入的次数

五.redisson实现的分布式锁能解决主从一致性的问题吗?

1.redisson实现的分布式锁不能解决主从一致性的问题,假设线程1加锁成功,master节点还未将这一数据同步到slave节点就宕机了,那么线程1的加标识将丢失

2.主从一致性问题也可以通过使用redisson提供的红锁来解决,红锁要求每次加锁至少要在一半以上的redis实例上创建锁,但使用红锁会造成性能低下的问题

3.如果业务中必须要保证数据的强一致性,建议采用zookeeper实现的分布式锁

相关推荐
数据库小组4 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅4 小时前
MybatisPlus增删改查操作
android·java·数据库
Kethy__4 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER4 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫5 小时前
MySQL备份与恢复
数据库·oracle
jnrjian5 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange5 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟6 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.7 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个7 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php