使用Redis+lua脚本实现分布式锁,

使用Redis+lua脚本实现分布式锁,解决高并发环境下优惠券和一人一单问题。

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

相关推荐

一、开场与项目基础先做个自我介绍。为什么用消息订阅异步落库,而不是同步写库?系统峰值大概在什么级别?有考虑过为什么库支撑不了吗?二、消息队列可靠性MQ 写失败了,怎么保证消息不丢?是先批量更新数据库,再写推送状态吗?先更新数据库再推送?如果推送状态写失败了会怎么办?可以支持重试吗?如果更新成功、推送也成功,重试一次会怎么样?会推两条吗?三、分布式锁项目里用的分布式锁具体怎么实现?锁是怎么释放的?锁过期时间设 30 天,30 天内重试会有什么问题?正常用 Redis 实现防并发的分布式锁,应该怎么实现?释放锁在哪里释放?正常请求结束后,在哪个环节释放锁?四、MySQL 优化线上一条 SQL 执行 5 秒,怎么优化?这 4 种 SQL case,哪些能命中索引,哪些命中不了?知道什么是 ICP 优化吗?五、高并发:商品超卖活动限量 100 件,说出三种防止超卖的方案,并对比优缺点。详细说下 Redis + DB 这种方案,怎么保证 Redis 和 DB 的一致性?这种方案和第二种 Redis + MQ 方案有区别吗?Redis + MQ 方式下,怎么保证 Redis 和 DB 的数据一致性?比如 Redis 扣减成功、MQ 写失败怎么办?如果加入对账机制,对账需要哪些数据?上游、下游分别要存哪些数据?六、大数据量分页与分库分表订单表 5000 万数据,分页查询怎么优化?订单表达到 1 亿条,单表查询越来越慢,怎么处理?水平分表具体怎么分?用户订单表,根据什么字段切分比较合适?七、数据库死锁数据库死锁产生的原因是什么?怎么避免?生产或日常开发中有没有遇到过死锁问题?八、Redis 缓存问题什么是缓存雪崩、缓存穿透、缓存击穿?分别怎么解决?九、缓存更新策略先更新数据库还是先更新 / 删除缓存?方案是什么?先更新 DB 再删缓存,那什么时候写缓存?十、限流方案实现严格一分钟内的请求限流,用 Redis 怎么做?还有其他限流方法吗?滑动窗口(ZSET)、令牌桶、漏桶这几种方案有什么区别?适用场景分别是什么?十一、前端基础前端平时有接触吗?比如 JS?什么是跨域?为什么会有跨域?怎么解决?了解 CSRF 攻击吗?怎么防御?防 CSRF 的 Token 怎么生成?十二、分布式事务了解什么是分布式事务吗?说一下两阶段提交。十三、算法题完成两道算法题,并讲解代码思路。十四、AI 工具与 Agent日常开发用过哪些 AI 工具?豆包帮你解决了什么问题?Cursor 是付费会员吗?怎么付费?AI 生成的代码怎么验证正确性?让 AI 写一个 Redis 分布式锁工具类,你会怎么描述需求、怎么写 Prompt?系统客服角色接入大模型做智能问答,整体架构和流程怎么设计?RAG 的整体流程是什么?一份文档怎么向量化接入?向量检索后,是把所有相关 wiki 都交给大模型吗?检索出的内容做精简压缩用什么实现?什么是 AI Agent?和普通写 Prompt 有什么区别?
点赞 评论 收藏
分享
评论
4
19
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务