深入理解 Redisson 原理:Redis 不只是缓存,更是分布式协调器

目录

一、前言

[一、什么是 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 提供的高级组件)

RMap

RSet

RQueue

RBlockingQueue

RDelayedQueue

十五、限流器原理

十六、布隆过滤器原理

[十七、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 的实现原理,不仅能应对面试,也能帮助我们设计更加稳定可靠的分布式系统。

相关推荐
pixelpilot11 小时前
微软常用运行库directx修复工具(directx repair)2026版directx下载下载安装教程
java·开发语言·其他·microsoft
码luffyliu1 小时前
企业级多agent知识库系统|超值源码+资料
java·agent·秋招·实习·rag·知识库系统
小小工匠1 小时前
Redis - 异步机制与阻塞规避:Redis 单线程模型的生存之道
数据结构·redis·性能优化·集群·持久化
wang09071 小时前
自己动手写一个spring之IOC_1
java·后端·spring
Jul1en_1 小时前
【Redis】Docker 部署集群补充说明
redis·docker·eureka
garmin Chen1 小时前
Prompt工程入门:让AI按你的要求工作(1)--prompt概述与设计
java·人工智能·python·junit·prompt·agent
@insist1232 小时前
系统架构设计师-信息安全核心要素与等级保护制度
架构·系统架构·软考·系统架构设计师·软件水平考试
上海云盾第一敬业销售7 小时前
CC攻击与DDoS攻击防护架构解析
架构·ddos
小马爱打代码9 小时前
Redis 集群方案详解:主从复制、哨兵、脑裂、分片集群和哈希槽
数据库·redis·哈希算法