Redisson可重入锁原理(基于黑马视频总结,保姆级)

上一篇文章我们基于redis的set nx ex 命令以及Lua脚本实现了基本的分布式锁,但是还存在一下几点问题。于是又引出了redisson。

为什么基于SETNX的分布式锁无法实现可重入

先在method1中获取锁,获取成功后又调用method2,而method2内部也会获取锁。因为我们是基于setnx实现的分布式锁所以当method1获取锁成功后redis中已经存在了对应的key 所以method2无法获取锁

实现可重入锁(用Lua脚本)

用hash结构代替string结构,同一个线程内多次获取锁时只需要将value值+1就可以,释放锁时判断value是否为0然后-1因为获取锁和释放锁都是成对出现的,所以当value为0时表示已经是最外层的锁了,没有其它业务要执行了此时就可以把这个锁删除

redisson可重入锁源码

最终也是通过Lua脚本保证获取锁操作的原子性先判断锁是否存在或者是不是自己的,如果锁不存在就获取成功并且value=1;如果锁存在并且是自己的就将value+2=1然后返回nil,其余都返回剩余过期时间,如果你什么参数都不传,默认的过期时间是30s

相关推荐
用户8307196840826 小时前
Spring Boot JWT登录授权使用指南(无感刷新)
java·spring boot
uup6 小时前
Redis 缓存击穿
java
怀旧,6 小时前
【Linux系统编程】11. 基础IO(上)
java·linux·服务器
TT哇6 小时前
【public ControllerException() { }】为了序列化
java·spring boot·spring·java-ee·maven
lang201509286 小时前
Sentinel黑白名单授权控制详解
java·算法·sentinel
chaodaibing6 小时前
【Java】一个批量更新插入数据到MySQL的工具类
java·开发语言·mysql
进阶的DW6 小时前
测开平台(后端开发)
数据库
在坚持一下我可没意见6 小时前
Spring 后端安全双剑(上篇):JWT 无状态认证 + 密码加盐加密实战
java·服务器·开发语言·spring boot·后端·安全·spring
就像风一样抓不住6 小时前
SpringBoot静态资源映射:如何让/files/路径访问服务器本地文件
java·spring boot·后端
缪懿6 小时前
javaEE:多线程,单列模式和生产者消费者模型
java·单例模式·java-ee