Redis分布式锁导致死锁、锁误删的场景及解决方法
创作时间:
作者:
@小白创作中心
Redis分布式锁导致死锁、锁误删的场景及解决方法
引用
CSDN
1.
https://blog.csdn.net/qq_33204709/article/details/139338591
Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。
Redis 可以通过 setnx 命令(set if not exists)命令实现分布式锁,实现方式如下所示:
# 加锁
setnx mylock 1
# 释放锁
del mylock
通过执行结果是否为1,可以判断是否成功获取到锁,如下图所示:
Redis 分布式锁存在什么问题?
Redis 分布式锁存在两个问题:
死锁问题:如果在加锁之后,未设置过期时间、锁忘记释放、加锁后还没来得及释放锁就宕机了这3种情况都会导致死锁问题。
锁误删问题:设置了超时时间,但是线程执行超过过期时间后锁误删问题。
解决死锁问题
- 方式一:set 升级
MySQL 中解决死锁问题是通过设置超时时间,Redis 也是如此,但是问题来了,第一步先加锁,然后再设置超时时间,那么就不满足原子性了,那怎么办?
官方在 Redis 2.6.12 版本之后,新增了一个功能,我们可以使用一条命令既执行加锁操作,又设置过期时间,相当于:setnx + expire。如下图所示:
- 第1条命令加锁成功,并设置 30s 过期时间。
- 第2条命令跟在第1条命令后,还没有超过 30s,所以加锁失败。
- 方式二:setIfAbsent 新方法
setIfAbsent() 是 Redis 专门为分布式锁实现的原子操作,其中封装了获取 key、设置 key、设置过期时间等操作。
RedisUtils 工具类:
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 原子性操作 加锁
*/
public boolean setIfAbsent(String key, String value, long timeout, TimeUnit unit) {
return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit)
热门推荐
黄金市场暗访报告:标签规范、克重测量、旧金调换全解析
基于深度学习的复合薄膜气泡智能检测技术研究
【非遗】酱油酿造技艺(先市酱油酿造技艺)
全球股市上演“过山车”行情,科技板块波动加剧,投资者如何应对?
酱油-中国传统调味品
核心K线组合形态5:早晨之星(图解)
瓶装葡萄酒可以放几年不变质?红酒存放几年饮用最佳?
如何理解超额准备金在金融体系中的作用?这些准备金如何影响市场流动性?
一片吐司的热量是多少?减肥期间可以吃吐司吗?
使用NodeLocal DNSCache提升Kubernetes集群DNS性能
宜春铜鼓县规划建设20万亩高标准黄精种植基地 打造百亿黄精产业
15个指标教你准确判断猫咪年龄
【收藏】叮!这份赡养老人个税专项附加扣除指南请查收!
党史经典书籍推荐!这几本书,是学习党史绕不开的佳作
2025年复旦大学应用心理专硕招生信息解析
酒店擅自分装洗发水、沐浴露?涉嫌违法!
今日头条为何没有展现量?解析原因与解决方案
《中国医药》杂志刊发论文评价连花清瘟在呼吸系统疾病中的应用
电动车全责交强险全赔吗
抗白三烯类药物有哪些
马东锡主演的五部动作片,拳拳到肉看点足,一部没看太遗憾!
国家集采药靠谱!全国三甲医院真实世界研究给出答案
交强险死亡伤残赔偿项目包括哪些?
婚姻大事何必托付“情感军师”?警惕情感主播网络“卖拐”
子产:春秋时期的杰出政治家与思想家
如何预防老人褥疮?江苏省人民医院专家给出专业建议
ChatGPT检测媒体偏见:潜力与局限性
双向孔板流量计的校准与维护方式
五险一金明细查询方法及常用问答
王者荣耀嬴政逆天出装,国服第一嬴政最强出装