Redis 高级客户端 Redisson 的使用
前置说明
这篇文章我将重点介绍在实际的业务开发中,我们如何构建一个真正干净的、基于 spring data + redisson 的应用客户端。在此基础上使用 缓存组件 和 限流器组件 看一下 redisson 的相关 API。redis 是集群环境,redisson 和 spring data 也都采用最新的前沿版本。
核心的配置代码
POM 依赖
1 | <properties> |
配置文件
application.yml
1 | spring: |
配置类
RedisClusterConfig:
读写分离的支持:
- setReadMode(ReadMode.SLAVE):Redisson 会通过负载均衡算法(你配置的 LoadBalancer)将所有的读请求分发到从节点(Slave),而写请求始终路由到主节点(Master)。
支持容错的支持:
- 重试机制: setRetryAttempts() 和 setRetryDelay() 这里使用了 EqualJitterDelay。在重试时引入了“随机抖动”,防止在大规模宕机时,所有客户端在同一时刻发起重试(即“惊群效应”),从而保护了 Redis 集群不被瞬间击垮。
- 超时控制: connectTimeout 和 timeout 确保了请求不会因为某个节点的网络波动而导致业务线程无限期阻塞。
自动发现集群变更感知支持 :
- 核心参数:setScanInterval(2000):定期执行 CLUSTER NODES 或 CLUSTER SLOTS。如果你的集群发生了主从切换、增加了新节点、或者某个节点下线,Redisson 会实时更新内部的路由表,业务代码对此完全无感知。
极度丰富的分布式锁的支持:
- 基本可重入和可延时锁(RedissonLock):它实现了标准的 java.util.concurrent.locks.Lock 接口,并扩展了 RLock。
- 联锁 (MultiLock):将多个锁合并成一个大锁,只有全部获取成功才算成功。常用于跨库事务控制。
- 红锁 (RedLock):针对 Redis 实例宕机场景的高可用锁算法。
- 读写锁 (ReadWriteLock):支持分布式环境下的并发读、互斥写,极大提升了缓存场景的吞吐量。
各种高级集合对象的支持:
- Redisson 几乎把整个 java.util 搬到了 Redis 里:RMapCache / RSetCache:支持元素级别的过期时间(TTL)。比如你可以往一个 Map 里存 100 个 Key,每个 Key 的过期时间都不一样。
- RBloomFilter (布隆过滤器):防止缓存穿透的神器。Redisson 封装得极其简单易用,一句话就能初始化上亿量级的过滤器。
分布式服务支持:
- RScheduledExecutorService:你可以像使用 Java 的 ScheduledExecutorService 一样,在集群中运行分布式定时任务。它支持任务重试、取消,并且能保证任务在集群中只运行一次。
远程服务调用支持:
- 基于 Redis 实现的轻量级 RPC。你可以像调用本地方法一样调用另一个微服务中的方法,无需引入复杂的 Dubbo 或 Spring Cloud。
1 | import com.fasterxml.jackson.annotation.JsonTypeInfo; |
JacksonConfig:
主要用于增强序列化器的相关配置,这里主要对时间字段格式的进行了处理。
1 | import com.fasterxml.jackson.core.JsonParser; |
RedissonProperties:
统一管理和收集 redisson 的配置参数。
1 | import lombok.Data; |
缓存组件的实现
切面实现
RedisCacheForWritingAspect
1 | import com.demo.component.jsoncache.RedisWritingCache; |
RedisCacheForReadingAspect:
1 | import com.demo.component.jsoncache.RedisReadingCache; |
SpringExpressionUtils:
Spring EL 表达式解析支持
1 | public class SpringExpressionUtils { |
应用组件
RedisWritingCache:
1 | /** |
RedisReadingCache:
1 | /** |
业务演示类
EmployeeDoc:
1 |
|
EmployeeService:
1 | /** |
EmployeeController:
1 | /** |
测试单元
1 | /** |
redisson 生成的锁数据:
1 | # 这段数据展示了 Redisson 分布式锁(RLock) 在 Redis 底层存储的典型结构。 |
限流器的实现
切面实现
1 | import com.demo.component.limiter.RateLimiter; |
应用组件
1 | /** |
新增业务代码
在原有的 EmployeeService 基础上增加注解 @RateLimiter 即可给实际相关接口加上限流功能:
1 | // 限制分布式应用每秒只能新增 5 个员工 (令牌桶模式),粒度是全局的【spel 解析成一个 "global" 字符串)】 |
测试单元
1 | import com.demo.App; |
Redis服务器生成的限流器数据:
1 | 192.168.1.166:7001> hgetall limit:emp:read:999 |