Redis——》实现分布式锁
短信预约 -IT技能 免费直播动态提醒
推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
Redis——》实现分布式锁
一、最简单的实现
1、实现:SETNX加锁+DEL释放锁
// 加锁:如果 key 不存在,才会设置它的值,否则什么也不做SETNX lock_key 1// 业务逻辑DO THINGS// 释放锁,删除keyDEL lock_key
2、优点
实现了加锁和释放锁
3、缺点
参考链接:
Redis——》死锁
Redis——》锁被别人释放
容易造成死锁
二、最严谨的实现
1、实现:SET加锁 + 唯一标识 + 过期时间 + Lua脚本释放锁
(1)加锁 + 唯一标识 + 过期时间
SET lock_key unique_value EX expire_time NX
(2)操作共享资源
(3)Lua脚本释放锁
GET判断锁是否归属自己,再DEL释放锁
//Lua脚本语言//释放锁,先判断这把锁是否归自己持有,比较unique_value是否相等,避免误释放if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0end
2、优点
实现了加锁和释放锁,不会出现死锁和释放别人的锁。
三、Java实现分布式锁
四、分布式锁可能遇到的问题
可能遇到的问题 | 解决方案 |
---|---|
死锁 | 设置过期时间 |
过期时间评估不好,锁提前过期 | 守护线程,自动续期 |
锁被别人释放 | 锁写入唯一标识,释放锁时先检查标识,再释放 |
来源地址:https://blog.csdn.net/weixin_43453386/article/details/132582133
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341