lua脚本是什么,有什么用,以及怎么用?

一、我们之前遇到了什么问题?(必须先懂)

我们之前写释放锁的代码是这样的:

java

运行

// 1. 判断锁是不是自己的
String id = stringRedisTemplate.opsForValue().get(key);
if(threadId.equals(id)){
    // 2. 是自己的,才删除
    stringRedisTemplate.delete(key);
}

这段代码不是原子的!

它分成 2 步

  1. (判断是不是我的锁)
  2. (释放锁)

高并发下会发生恐怖的事情:

  1. 线程 A 查询 → 是我的锁
  2. 刚查完,突然卡住了!
  3. 锁超时过期 → Redis 自动删了
  4. 线程 B 抢到锁
  5. 线程 A 恢复 → 直接删锁!
  6. 线程 A 把线程 B 的锁删了!

二、为什么会发生?

因为 查询 和 删除 是两步!中间可以被打断!

plaintext

查询 → 卡住 → 锁超时 → 别人上锁 → 你删除 → 删错锁!

三、怎么解决?

必须让 查询 + 删除 变成一步执行,不能被打断!

谁能做到?

Lua 脚本!

四、Lua 脚本怎么实现原子性?

原理超级简单:

Redis 执行 Lua 脚本时,会把整个脚本当成一条命令!

中间不允许任何其他命令插入!

绝对不被打断!

五、黑马点评里的 Lua 脚本(释放锁)

lua

-- 1. 获取锁中的线程标识
local id = redis.call('get', KEYS[1])

-- 2. 比较是否是自己的线程
if id == ARGV[1] then
    -- 3. 是自己的,删除锁
    return redis.call('del', KEYS[1])
end

-- 4. 不是自己的,直接返回 0
return 0

这一段代码在 Redis 中是 一步执行

六、Lua 脚本如何保证原子性?(最核心)

在 Redis 中,Lua 脚本是独占执行的!

意思:

  • Redis 单线程执行 Lua
  • 执行期间,其他命令必须排队!
  • 查询 和 删除 绝对连在一起,不可能被打断!

七、用了 Lua 之后,恐怖场景彻底消失!

流程变成:

  1. 线程 A 执行 Lua 脚本
  2. 查询 + 删除 一步做完
  3. 中间不可能卡住、不可能被打断、不可能插入其他命令

所以:

绝对不会出现:刚查完锁,就被别人抢走,然后删错锁的问题!

八、最直白总结(3 句话)

  1. 原来释放锁是两步(查、删),会被打断 → 出现删错锁的 BUG
  2. Lua 脚本把两步变成一步 → 原子性,绝对不被打断
  3. Redis 单线程执行 Lua → 绝对安全

九、一句话记忆

Lua 脚本 = 多条 Redis 命令合成一条,保证原子性,不被打断!

你现在是不是彻底懂了?

整个黑马点评分布式锁的终极方案就是:

  1. setnx + 过期时间 加锁
  2. Lua 脚本 释放锁(保证原子性)
  3. 解决:删错锁问题
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-26 15:37
1、这群人晚上 11 点发朋友圈:"凌晨 11 点,三环的灯还亮着。" 实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1. 挂胸前的工牌(地铁里只挂不收,怕你看不见 logo)2. 降噪耳机(不放音乐也戴着,避免别人跟自己说话)3. 印 logo 的电脑包(字节红 / 腾讯蓝 / 阿里橙 / 美团黄)4. 手表(最好显示心率,午饭后必发"步数已破 6,000")
牛客30247842...:因为不好进啊要是大厂随便进哪来这么多人装逼
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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