高并发秒杀下,如何避免 Redis 分布式锁的坑?

秒杀场景:

优化一:

负载均衡 分布式部署

nginx和Java的springboot gateway 网关

问题:

Java中的锁,只能锁住一个线程,对于分布式情况下,每台服务器都会有一个锁,因为锁是jvm级别的

优化二:

redis分布式锁

通过redis的SetNX实现分布式锁

如果锁住某个key,就会返回true,没锁上就返回false

问题:

用户在请求过程中,如果用户所处的服务器挂掉,那么分布式锁,无法解锁

导致其他请求来,给该key上锁,无法上锁,出现死锁

解决:

给分布式锁设置过期时间

新问题:

如果业务时间长,锁提前释放 ,又会造成超卖的问题

优化三:

1.给锁加长时间,并添加子线程每10秒确认线程是否在线,在线则将过期时间重设

2.给锁加唯一id(uuid)解决处理完释放其他线程的锁的情况

重点:以上优化可以用redis组件redisson来解决实现分布式锁

redisson原理:

问题:

如果redis使用的是 主从复制的模式,有主节点和从节点,设置锁时 只能给主节点设置

如果给主节点设置锁,这时如果主节点突然宕机了,从节点没有同步到这把锁,这是又会出现超卖问题

解决方案:

redisson有一个read lock

保证所有你提供的节点都存储完毕,才相应锁成功

相关推荐
weixin_424999365 分钟前
mysql行级锁失效的原因排查_检查查询条件与执行计划
jvm·数据库·python
Polar__Star12 分钟前
uni-app怎么实现App端一键换肤 uni-app全局样式动态切换【实战】
jvm·数据库·python
南境十里·墨染春水1 小时前
linux学习进展 进程间通讯——共享内存
linux·数据库·学习
斯维赤1 小时前
Python学习超简单第八弹:连接Mysql数据库
数据库·python·学习
Chuer_2 小时前
讲透财务Agent核心概念,深度拆解财务Agent应用趋势
大数据·数据库·安全·数据分析·甘特图
gushinghsjj2 小时前
什么是主数据管理平台?怎么构建主数据管理平台?
大数据·数据库
Generalzy2 小时前
TinyDB轻量文档数据库
数据库
qq_654366982 小时前
如何排查Oracle客户端连接慢_DNS解析超时与sqlnet配置优化
jvm·数据库·python
黄昏晓x2 小时前
数据库基础
数据库·adb
李白客2 小时前
国产数据库选型指南:从技术路线到实战要点
运维·数据库·数据库架构·迁移学习