
Redisson 不仅仅是一个 Redis 客户端,它更是一个在 Redis 基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)。它的核心目标是让 Java 开发者能够以最自然的方式使用 Redis,将复杂的 Redis 命令封装成大家熟悉的 Java 接口(如 java.util.concurrent 包下的接口)。
Redisson 的原理可以概括为:通过 Netty 实现高性能、非阻塞的通信,将 Redis 的数据结构映射为 Java 对象和分布式对象,并在此基础上,利用 Redis 的单线程原子性特性,实现了一系列分布式的、线程安全的 Java 常用工具。
ConnectionManager 来统一管理这些连接的生命周期、心跳检测、重连机制等。get("key") 时,Redisson 会通过 Netty 将一个请求写入 Channel,然后立即返回一个 RFuture 对象。你可以同步等待这个 Future(future.get()),也可以为其添加监听器进行异步回调。这为构建高并发应用打下了基础。JacksonJsonCodec,但你也可以选择 StringCodec、AvroCodec 等,或者自定义。这保证了存储格式的灵活性。这是 Redisson 最核心、最巧妙的部分。它不仅仅是发送命令,而是在 Redis 的数据结构上构建了一层对象逻辑。
Redisson 将 Redis 的每一种基本数据结构都包装成了一个 Java 对象。
RList.add(object) 时,Redisson 底层会执行 RPUSH 命令。RList 实现了 java.util.List 接口,所以你感觉像是在操作本地集合。java.util.Map 接口。底层使用 HMSET, HGETALL 等命令。java.util.SortedSet 接口。原理:这些对象内部持有一个 CommandAsyncExecutor。你的每一个方法调用(如 map.put(key, value)),都会被转换成一个或多个 Redis 命令,并通过 Netty 发送给 Redis 服务器。
这是对分布式对象的扩展,增加了本地缓存功能。例如 RListCache 和 RMapCache。
这是 Redisson 最著名的功能。它实现了 java.util.concurrent.locks.Lock 接口。
原理图如下:

加锁原理(lock() 方法):
-- KEYS[1] 是锁的key,ARGV[1] 是锁的过期时间,ARGV[2] 是唯一值
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;
-- 锁已存在,检查是否是当前线程持有的
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
-- 是当前线程,重入次数+1
redis.call('hincrby', KEYS[1], ARGV[2], 1);
redis.call('pexpire', KEYS[1], ARGV[1]);
return nil;
end;
-- 锁被其他线程占用,返回锁的剩余生存时间
return redis.call('pttl', KEYS[1]);pexpire 命令)。只要 JVM 没有挂掉,这个锁就不会因为超时而被意外释放,从而避免了死锁。如果 JVM 挂掉,看门狗线程也随之停止,锁最终会自动过期。解锁原理(unlock() 方法):
-- KEYS[1] 是锁的key,ARGV[1] 是唯一值
if (redis.call('hexists', KEYS[1], ARGV[1]) == 0) then
return nil;
end;
-- 重入次数-1
local counter = redis.call('hincrby', KEYS[1], ARGV[1], -1);
if (counter > 0) then
-- 如果重入次数还大于0,则重新设置过期时间
redis.call('pexpire', KEYS[1], 30000);
return 0;
else
-- 重入次数为0,删除key
redis.call('del', KEYS[1]);
-- 发布一条解锁消息,通知其他等待的客户端
redis.call('publish', KEYS[2], ARGV[2]);
return 1;
end;
return nil;等待锁的原理: 如果获取锁失败,客户端并不会不停地轮询,而是通过 Redis 的发布订阅(Pub/Sub) 功能,订阅一个特定的频道。当锁被释放时,当前持有锁的客户端会发布一个消息(见上面解锁脚本的最后),所有等待的客户端都会收到通知,然后竞争性地再次尝试加锁。这大大减少了不必要的网络请求。
RSemaphore, RCountDownLatch)原理与锁类似,都是基于 Redis 的原子性操作(Lua 脚本)和发布订阅机制。
RSemaphore: 使用 Redis 的字符串结构存储许可数量。acquire() 减少数量,release() 增加数量。如果没有许可,则通过发布订阅等待。RCountDownLatch: 使用 Redis 的字符串结构存储计数。countDown() 递减计数,await() 等待计数变为0。当计数为0时,通过发布订阅通知所有等待的线程。Redisson 能够无缝地与 Redis 集群配合工作。
-MOVED 错误,Redisson 的 ClusterConnectionManager 会自动更新其 Slot-Node 映射表,并将命令重新路由到正确的节点。List, Map, Lock 等)。简单来说,Redisson 的原理就是 “用 Redis 的命令做砖瓦,用 Lua 脚本做水泥,用 Netty 做骨架,为 Java 世界构建了一座名为 ‘分布式工具’ 的大厦”。它让你在分布式环境中,获得了近乎与单机应用相同的编程体验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。