使用Redis+lua脚本实现分布式锁,
使用Redis+lua脚本实现分布式锁,解决高并发环境下优惠券和一人一单问题。
有大佬能解释一下 为什么要用分布式锁不用单锁呀?为什么不把优惠券直接放进redis作为一个list使用? #牛客在线求职答疑中心# #牛客解忧铺#


有大佬能解释一下 为什么要用分布式锁不用单锁呀?为什么不把优惠券直接放进redis作为一个list使用? #牛客在线求职答疑中心# #牛客解忧铺#
全部评论
AI基本上回答完了。
先不说你单锁是什么意思,我就理解为synchronized或者ReentrantLock这种单机锁。首先是服务是会做集群的(就是在多台机器里面部署同一个后台服务),这样每个机器只能自己锁自己,锁不了整体,没什么意义。
分布式锁是用的map,不是另一个人说的string。map的数据结构是key-field-value,对应是keyName-(clientIp+threadId)-lockedTime,然后自己加上过期时间。这样就是可重入的。
其他问题可以说详细点。
Redis里面有一个setnx的命令可以作为分布式锁去用的,但是这个锁有一些缺陷,比如不支持重入,还有就是加这个锁需要设置超时时间,但是如果过了超时时间逻辑还没执行完就导致锁失效了,不设置时间万一服务器宕机锁就一直存在了,Redission+lua解决了这俩问题,大概是这样我自己的理解
哇,看起来你遇到了一个很有挑战性的问题呢!
首先,使用分布式锁而不是单锁的原因主要是因为:
1. **扩展性**:当系统需要横向扩展到多台服务器时,单锁可能会成为瓶颈,而分布式锁可以在多台服务器之间共享,提高系统的整体性能。
2. **容错性**:单锁如果所在的服务器出现问题,可能会导致锁无法释放,而分布式锁可以通过Redis这样的外部存储来保证锁的状态不会因为服务器的故障而丢失。
至于为什么不用Redis的List来实现优惠券的发放,主要有以下几点考虑:
- **原子性**:Redis的List虽然可以用来实现队列,但在高并发环境下,如果使用List的LPUSH和RPOP操作,可能会遇到并发问题,比如多个客户端同时操作List,可能会导致数据不一致。
- **性能**:使用Lua脚本可以保证Redis操作的原子性,减少网络延迟和多次往返时间,提高性能。
- **安全性**:分布式锁可以防止同一用户多次领取优惠券或者同一优惠券被多次使用,增加了系统的安全性。
现在,让我们来聊聊分布式锁和Lua脚本的具体实现吧![眨眼]
如果你愿意的话,可以点击我的头像,我们可以私信聊聊,我会尽力帮你解答更多细节哦~[点击我的头像,开始私信吧!]
相关推荐
03-20 15:16
门头沟学院 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享