目录
[一、什么是 Redisson](#一、什么是 Redisson)
[二、Redisson 核心架构](#二、Redisson 核心架构)
[三、Redisson 与 Jedis 的区别](#三、Redisson 与 Jedis 的区别)
[四、Redisson 分布式锁原理](#四、Redisson 分布式锁原理)
[五、为什么不用 SETNX + EXPIRE](#五、为什么不用 SETNX + EXPIRE)
[六、Redisson 锁的数据结构](#六、Redisson 锁的数据结构)
[七、Redisson 为什么支持可重入锁](#七、Redisson 为什么支持可重入锁)
[八、Lua 脚本保证原子性](#八、Lua 脚本保证原子性)
[九、Redisson 看门狗机制(Watch Dog)](#九、Redisson 看门狗机制(Watch Dog))
[十、Watch Dog 工作原理](#十、Watch Dog 工作原理)
[十一、Watch Dog 为什么不会死锁](#十一、Watch Dog 为什么不会死锁)
[十二、Redisson 解锁原理](#十二、Redisson 解锁原理)
[十三、RedLock 红锁机制](#十三、RedLock 红锁机制)
[十四、Redisson 提供的高级组件](#十四、Redisson 提供的高级组件)
[十七、Redisson 线程模型](#十七、Redisson 线程模型)
[Redisson 分布式锁原理?](#Redisson 分布式锁原理?)
[什么是 WatchDog?](#什么是 WatchDog?)
[为什么使用 Lua?](#为什么使用 Lua?)
[Redisson 为什么支持可重入?](#Redisson 为什么支持可重入?)
[RedLock 原理?](#RedLock 原理?)
一、前言
在现代互联网系统中,Redis 早已不仅仅是一个缓存工具。
除了缓存之外,它还承担着:
分布式锁
延迟队列
限流器
布隆过滤器
消息队列
分布式对象
等重要职责。
而在 Java 生态中,最流行的 Redis 客户端除了 Jedis、Lettuce 外,还有一个重量级框架:
Redisson
很多面试官都会问:
Redisson 和 Jedis 有什么区别?
Redisson 分布式锁为什么安全?
Redisson 如何实现自动续期?
什么是看门狗机制?
Redisson 为什么能解决 Redis 分布式锁问题?
本文将从源码设计思想出发,带你深入理解 Redisson 的核心原理。
一、什么是 Redisson
Redisson 是一个基于 Redis 的 Java 客户端框架。
官方定位:
Redis Java Client with Distributed Objects and Services
简单理解:
Jedis
=
操作 Redis
Redisson
=
使用 Redis 实现各种分布式组件
例如:
java
RLock lock = redissonClient.getLock("orderLock");
lock.lock();
try {
//业务逻辑
} finally {
lock.unlock();
}
开发者不需要关心:
SETNX
EXPIRE
Lua脚本
续期机制
Redisson 已经全部封装完成。
二、Redisson 核心架构
整体架构:

Redisson 本质上:
将 Redis 封装成 Java 对象
例如:
Map
对应:
RMap
三、Redisson 与 Jedis 的区别
很多人容易混淆。
实际上两者定位完全不同。
| 对比项 | Jedis | Redisson |
|---|---|---|
| 操作方式 | Redis命令 | Java对象 |
| 分布式锁 | 手动实现 | 内置支持 |
| 延迟队列 | 无 | 支持 |
| 布隆过滤器 | 无 | 支持 |
| 自动续期 | 无 | 支持 |
| 易用性 | 一般 | 非常高 |
例如 Jedis:
jedis.set(
"key",
"value"
);
Redisson:
java
RMap<String,Object> map =
redisson.getMap("user");
更符合面向对象思想。
四、Redisson 分布式锁原理
最经典的问题:
Redisson 分布式锁怎么实现?
底层实际上利用:
SETNX
+
过期时间
实现。
Redis命令:
SET order_lock uuid NX PX 30000
含义:
不存在则创建
30秒后自动过期
成功:
获得锁
失败:
等待
五、为什么不用 SETNX + EXPIRE
错误写法:
SETNX lock xxx
EXPIRE lock 30
问题:
SETNX成功
程序崩溃
EXPIRE未执行
导致:
死锁
因此 Redis 官方推荐:
SET key value NX PX 30000
原子完成。
六、Redisson 锁的数据结构
加锁成功后:
order_lock
=
UUID:ThreadId
例如:
d2abf3:15
表示:
JVM实例ID
线程ID
结构:

这样能够识别:
锁属于哪个线程
七、Redisson 为什么支持可重入锁
Java中的 ReentrantLock:
lock.lock();
lock.lock();
允许重复加锁。
Redisson 同样支持。
底层结构:
Hash
例如:
order_lock
{
thread1 : 2
}
含义:
线程1持有锁
重入次数=2
解锁:
计数减1
直到:
0
真正删除锁。
八、Lua 脚本保证原子性
加锁过程:
判断锁是否存在
不存在则创建
设置过期时间
必须保证:
原子执行
因此 Redisson 使用:
Lua Script
例如:
Lua
if(redis.call('exists',KEYS[1]) == 0)
then
redis.call('hset',KEYS[1],ARGV[2],1)
redis.call('pexpire',KEYS[1],ARGV[1])
return nil
end
Redis 执行 Lua:
单线程
天然原子
九、Redisson 看门狗机制(Watch Dog)
这是 Redisson 最经典的设计。
问题:
业务执行30分钟
锁只设置30秒
怎么办?
方案1:
lock.lock(1800,SECONDS);
手动设置。
问题:
时间难预估
Redisson 提供:
lock.lock();
默认:
30秒
但自动续期。
十、Watch Dog 工作原理
流程:

核心思想:
每隔10秒
刷新过期时间
重新设置30秒
因此:
锁永不过期
直到:
线程结束
十一、Watch Dog 为什么不会死锁
如果:
服务宕机
WatchDog线程:
一起消失
此时:
不再续期
锁会在:
30秒后自动过期
因此:
避免永久死锁
十二、Redisson 解锁原理
解锁不是简单:
DEL lock
因为可能误删别人锁。
例如:
线程A锁过期
线程B获得锁
线程A执行DEL
结果:
删掉线程B锁
严重事故。
Redisson 使用:
if lock属于当前线程
then
删除
end
保证安全。
十三、RedLock 红锁机制
单 Redis 存在风险:
Redis主节点宕机
从节点尚未同步。
可能导致:
锁丢失
RedLock:

规则:
5个Redis节点
至少3个成功
才算获得锁
提高可靠性。
十四、Redisson 提供的高级组件
除了锁之外。
Redisson 还封装了大量组件。
RMap
类似:
ConcurrentHashMap
使用:
java
RMap<String,String> map =
redisson.getMap("user");
RSet
类似:
HashSet
RQueue
队列:
java
RQueue<String> queue =
redisson.getQueue("task");
RBlockingQueue
阻塞队列:
queue.take();
RDelayedQueue
延迟队列:
java
delayQueue.offer(
"订单",
30,
TimeUnit.MINUTES
);
适合:
订单超时取消
十五、限流器原理
Redisson 内置:
RRateLimiter
实现:
令牌桶算法
示例:
java
rateLimiter.trySetRate(
RateType.OVERALL,
100,
1,
RateIntervalUnit.SECONDS
);
表示:
每秒100次请求
十六、布隆过滤器原理
组件:
RBloomFilter
作用:
缓存穿透
示例:
java
RBloomFilter<String> bloom =
redisson.getBloomFilter("user");
底层:
位图
+
多个哈希函数
实现。
十七、Redisson 线程模型
网络通信基于:
Netty
架构:

优势:
高性能
异步IO
低延迟
十八、面试高频问题
Redisson 分布式锁原理?
SET NX PX
Lua脚本
Hash结构
什么是 WatchDog?
自动续期机制
为什么使用 Lua?
保证原子性
Redisson 为什么支持可重入?
Hash记录线程和重入次数
RedLock 原理?
多数派节点成功
才算加锁成功
十九、总结
Redisson 不仅仅是 Redis 客户端。
更像是:
Redis 分布式中间件框架
核心能力包括:
分布式锁
延迟队列
限流器
布隆过滤器
分布式集合
分布式对象
其最重要的设计思想:
Redis负责存储
Lua负责原子性
WatchDog负责续期
Netty负责通信
整个分布式锁流程可以概括为:
加锁
↓
SET NX PX
↓
WatchDog续期
↓
业务执行
↓
Lua安全解锁
在实际面试中,Redisson 几乎是 Redis 高并发场景的必考内容。
掌握 Redisson 的实现原理,不仅能应对面试,也能帮助我们设计更加稳定可靠的分布式系统。