- Redisson 大量用了 Lua
- 远不止把 Redis 命令拼个 Lua 就完事
1. 加锁、解锁是 Lua
Redisson 最核心的 可重入锁:
- 加锁:
hset+pexpire用 Lua 原子执行 - 解锁:
hincrby+del也是 Lua 原子执行
用 Lua 保证原子性。
2. Redisson
比手写 SETNX + Lua 多了一整套分布式锁生产级系统:
① 锁自动续期(看门狗机制)
- 业务没执行完,锁快过期了
- Redisson 有 watchdog 后台线程自动续期
- 避免:任务没跑完,锁被释放 → 超严重问题
手写 Lua 根本做不到这个。
② 真正的可重入锁
同一个线程、多次加锁,只计数,不阻塞。内部用 hash 结构 存:
key -> {线程ID: 重入次数}
手写简单 Lua 一般做不到可重入。
③ 阻塞等待 + 重试
lock()会阻塞- 内部用 Redis 发布订阅 实现锁等待唤醒
- 不是死循环空轮询
性能比你自己写 while true 好太多。
④ 支持一整套锁体系
- 可重入锁
RLock - 公平锁
RedissonFairLock - 读写锁
RReadWriteLock - 红锁
RedissonRedLock - 多级缓存、分布式信号量、限流......
这些全是基于 Lua + 线程调度 + 心跳 + 订阅封装的完整组件。
⑤ 解决主从切换 锁失效问题
Redis 主从异步复制:
- 主加锁 → 还没同步到从
- 主挂了 → 从变成主
- 别人能再加锁,出现锁重复
Redisson 提供 RedLock(红锁) 来尽量缓解。
3. 一句话总结
Redis + Lua = 原子操作基础 Redisson = 分布式锁完整实现 + 生产级可靠性
理解成:
- 手写:简陋小作坊
- Redisson:标准化工厂