redis分布式锁解决超卖问题

本文探讨了在集群分布式环境下,使用synchronized关键字遇到的问题及其解决办法。由于Redis是单线程的,当Web服务挂掉可能导致锁无法释放,解决方案是为锁设置过期时间。此外,针对可能出现的并发问题,如线程间锁的误释放,提出了使用UUID作为锁的value来确保只有拥有锁的线程才能释放锁。文章深入分析了分布式锁在高并发场景下的挑战及应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么synchronized不可以?

在这里插入图片描述
synchronized锁是jvm进程级别锁。
在集群分布式下:
在这里插入图片描述
每一个tomat应用都是一个jvm进程。

SETNX

在这里插入图片描述

模拟场景代码

在这里插入图片描述
如果出现异常,把释放锁 放进finally代码块。
在这里插入图片描述
同一时刻多个请求过来的时候,只有一个请求会返回ture,因为redis是单线程的特性。
其他请求 返回:当前人数过多,请稍微再试;

问题一

redis是单线程,web服务挂掉后,finally代码块的锁始终无法释放,导致其他请求也无法进行

解决:在这里插入图片描述
增加key的过期时间

问题二

超时时间设置成功之前出现了bug怎么处理
解决:把设置值和超时时间绑定在一起
在这里插入图片描述

问题三

高并发场景下存在的问题,前面线程释放了后面线程刚加的锁。B线程自己加的锁被A线程给释放了。
在这里插入图片描述
解决方法:
每一个线程设置一个uuid,并将uuid作为redis的value;那么在释放锁的时候先判断是不是自己线程的锁,如果是再释放
在这里插入图片描述
详情点击redis分布式锁实现场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值