Redisson 详解:基于 Redis 的 Java 高级客户端(分布式对象、锁、集合、消息等)
Redisson 是一个基于 Netty 的高性能 Java 客户端,它不仅仅是一个 Redis 操作工具,更是一个 分布式编程框架,提供了丰富的分布式数据结构和同步工具,极大简化了在分布式系统中使用 Redis 的复杂性。
🌟 官网:https://redisson.org
📦 GitHub:https://github.com/redisson/redisson
一、Redisson 的定位与核心价值
| 传统 Redis 客户端(如 Jedis) | Redisson |
|---|---|
| 提供基础命令操作(SET/GET) | 提供高级分布式对象(Map、Queue、Lock 等) |
| 需手动实现分布式锁逻辑 | 内置可重入锁、公平锁、读写锁 |
| 原生数据结构操作 | 提供分布式集合、计数器、布隆过滤器等 |
| 无对象映射机制 | 支持 RMap、RList 等类集合接口 |
| 低级别网络通信 | 基于 Netty 异步非阻塞,性能高 |
✅ 一句话总结:
Redisson = Redis + 分布式并发工具包 + 分布式数据结构 + 高可用支持
二、Redisson 的核心特性
| 特性 | 说明 |
|---|---|
| 🔐 分布式锁 | 可重入、公平、读写锁,支持 Redis 单机/集群/哨兵 |
| 🧩 分布式对象 | RMap、RList、RSet、RQueue、RDeque、RSortedSet 等 |
| ⚙️ 异步与响应式支持 | 支持 Async, Reactive, RxJava2/3 |
| 📦 分布式集合 | 分布式 ConcurrentMap, BlockingQueue, Semaphore 等 |
| 🔁 高可用支持 | 支持主从、哨兵、集群、云托管(AWS ElastiCache) |
| 🧼 自动连接管理 | 连接池、重连、故障转移 |
| 🧪 分布式服务 | 分布式限流器、布隆过滤器、延迟队列、地理围栏 |
| 🔄 发布订阅 | 支持 Pattern 订阅、可靠消息广播 |
| 💾 对象编码支持 | JSON、Kryo、FST、Protobuf、Avro 等序列化方式 |
三、快速入门:Hello World
1. 添加依赖(Maven)
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.24.1</version>
</dependency>
2. 创建 Redisson 客户端
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonExample {
public static void main(String[] args) {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
// 使用分布式对象
RMap<String, String> map = redisson.getMap("simpleMap");
map.put("key1", "value1");
System.out.println(map.get("key1")); // 输出: value1
redisson.shutdown();
}
}
四、核心功能详解
1. 分布式锁(Distributed Locks)
Redisson 提供了多种分布式锁实现,基于 Redis 的 SETNX + Lua 脚本,支持自动续期(Watchdog 机制)。
✅ 可重入锁(Reentrant Lock)
RLock lock = redisson.getLock("myLock");
try {
// 尝试加锁,最多等待 10 秒,锁自动释放时间 30 秒
boolean res = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (res) {
try {
// 执行业务逻辑
System.out.println("Locked!");
} finally {
lock.unlock();
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
🔐 锁特性:
- 可重入:同一线程可多次获取
- 自动续期:锁过期前自动延长(默认 30s → 30s)
- 阻塞/非阻塞:支持
tryLock()和lock() - 公平锁:
RLock fairLock = redisson.getFairLock("fairLock"); - 读写锁:
RReadWriteLock rwLock = redisson.getReadWriteLock("rwLock");
🧠 原理简述:
- 使用 Lua 脚本保证原子性
- Watchdog 线程每 10s 检查是否仍持有锁,自动
EXPIRE延长 - 解锁时校验 threadId,防止误删
2. 分布式集合(Distributed Collections)
✅ RMap(分布式 Map)
RMap<String, User> map = redisson.getMap("users");
map.put("user:1001", new User("Alice", 25));
User user = map.get("user:1001");
// 支持本地缓存(减少网络调用)
RMapCache<String, User> mapCache = redisson.getMapCache("usersCache");
mapCache.put("user:1001", user, 30, TimeUnit.MINUTES); // 30分钟过期
✅ RList / RSet / RSortedSet
RList<String> list = redisson.getList("tasks");
list.add("task1");
list.add("task2");
RSet<String> set = redisson.getSet("tags");
set.add("java");
set.add("redis");
RSortedSet<String> sortedSet = redisson.getSortedSet("leaderboard");
sortedSet.add("Alice");
sortedSet.add("Bob");
sortedSet.valueRange(0, -1); // 获取排行榜
3. 分布式队列(Queue / Blocking Queue)
✅ RQueue(FIFO 队列)
RQueue<String> queue = redisson.getQueue("taskQueue");
queue.offer("task1");
String task = queue.poll();
✅ RBlockingQueue(阻塞队列)
RBlockingQueue<String> bQueue = redisson.getBlockingQueue("blockingQueue");
// 生产者
bQueue.offer("item1");
// 消费者(阻塞等待)
String item = bQueue.take(); // 无元素时阻塞
✅ RDelayedQueue(延迟队列)
RBlockingQueue<String> queue = redisson.getBlockingQueue("delayQueue");
RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(queue);
// 5秒后才进入目标队列
delayedQueue.offer("task1", 5, TimeUnit.SECONDS);
// 消费者从 queue.take() 获取延迟到期的任务
4. 分布式服务(Distributed Services)
✅ 分布式限流器(RateLimiter)
RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
// 每秒最多 10 个许可
rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);
if (rateLimiter.tryAcquire()) {
// 执行操作
} else {
// 限流中
}
✅ 布隆过滤器(Bloom Filter)
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("bloom");
bloomFilter.tryInit(1000000, 0.03); // 初始化:100万容量,3%误判率
bloomFilter.add("user123");
boolean mayExist = bloomFilter.contains("user123");
✅ 分布式计数器
RAtomicLong counter = redisson.getAtomicLong("counter");
counter.incrementAndGet(); // 原子自增
counter.addAndGet(10);
5. 发布订阅(Pub/Sub)
// 订阅
RTopic topic = redisson.getTopic("chat");
int listenerId = topic.addListener(String.class, (channel, msg) -> {
System.out.println("Received: " + msg);
});
// 发布
topic.publish("Hello, everyone!");
// 取消订阅
topic.removeListener(listenerId);
支持:
PatternTopic:按模式订阅多个频道- 可靠消息(结合 RQueue 实现)
6. 高可用配置支持
Redisson 支持多种 Redis 部署模式:
✅ 哨兵模式(Sentinel)
Config config = new Config();
config.useSentinelServers()
.addSentinelAddress("redis://192.168.1.1:26379", "redis://192.168.1.2:26379")
.setMasterName("mymaster");
✅ 集群模式(Cluster)
config.useClusterServers()
.addNodeAddress("redis://192.168.1.1:7000", "redis://192.168.1.1:7001");
✅ 主从模式
config.useMasterSlaveServers()
.setMasterAddress("redis://192.168.1.1:6379")
.addSlaveAddress("redis://192.168.1.2:6379");
五、序列化配置(Codec)
Redisson 支持多种序列化方式,默认使用 StringCodec。
config.setCodec(new JsonJacksonCodec()); // JSON
// config.setCodec(new Kryo5Codec()); // 高性能二进制
// config.setCodec(new FstCodec()); // 快速序列化
推荐:
- JSON:可读性好,跨语言
- Kryo/FST:性能高,适合内部服务
六、Spring 集成(Spring Boot)
1. 添加依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.24.1</version>
</dependency>
2. 配置文件 application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
# Redisson 配置
redisson:
config: |
singleServerConfig:
address: "redis://127.0.0.1:6379"
threads: 16
nettyThreads: 32
codec: !org.redisson.codec.JsonJacksonCodec {}
3. 注入使用
@Autowired
private RedissonClient redissonClient;
@GetMapping("/test")
public String test() {
RMap<String, String> map = redissonClient.getMap("testMap");
map.put("k1", "v1");
return map.get("k1");
}
七、最佳实践与注意事项
| 项目 | 建议 |
|---|---|
| 🔐 锁使用 | 使用 tryLock(timeout) 防止死锁 |
| 🧠 Watchdog | 默认 30s 锁过期,业务执行时间不宜过长 |
| 🚫 大对象 | 避免在 RMap 中存储大对象,影响序列化性能 |
| 🔄 连接池 | 合理设置 connectionPoolSize、idleConnectionTimeout |
| 📊 监控 | 结合 Micrometer 或 Prometheus 监控 Redisson 指标 |
| 🧹 资源释放 | redisson.shutdown() 关闭客户端 |
| 🧪 异常处理 | 捕获 RedisConnectionException 等网络异常 |
八、常见问题(FAQ)
Q1:Redisson 锁会自动续期吗?
✅ 是的!通过 Watchdog 机制,每 10s 检查一次,自动延长锁过期时间(默认 30s)。
Q2:Redisson 和 RedisTemplate 有什么区别?
RedisTemplate:Spring Data Redis,偏重基础操作Redisson:提供高级分布式对象和同步工具,更适合复杂分布式场景
Q3:Redisson 支持 Redis 7.x 吗?
✅ 支持。Redisson 持续更新,兼容最新 Redis 版本。
Q4:Redisson 性能如何?
- 基于 Netty 异步非阻塞
- 支持批量操作、管道
- 性能优于 Jedis(尤其在高并发下)
九、总结:Redisson 的核心优势
| 场景 | Redisson 解决方案 |
|---|---|
| 分布式锁 | RLock、RReadWriteLock |
| 缓存共享 | RMap、RMapCache |
| 消息队列 | RQueue、RBlockingQueue、RDelayedQueue |
| 限流控制 | RRateLimiter |
| 去重判断 | RBloomFilter |
| 实时通信 | RTopic 发布订阅 |
| 高可用 | 支持哨兵、集群、主从 |
✅ 结语:
Redisson 是 Java 生态中 最强大、最成熟的 Redis 高级客户端。它将 Redis 从“缓存中间件”升级为“分布式基础设施”,让你像使用本地 Java 对象一样操作分布式资源。
📌 推荐使用场景:
- 分布式系统中的锁与同步
- 微服务间的共享状态管理
- 延迟任务、限流、布隆过滤等高级功能
掌握 Redisson,等于掌握了 分布式编程的“瑞士军刀”。
Redisson:基于 Redis 的 Java 高级客户端详解
&spm=1001.2101.3001.5002&articleId=149868945&d=1&t=3&u=7e5ba2dc251342b69ba2ec86bb72d951)
5343

被折叠的 条评论
为什么被折叠?



