spring-boot-starter-data-redis 与 org.redisson 区别 联系
spring-boot-starter-data-redis 与 org.redisson 区别 联系? 是否需要共存?如何配置使用?
这是一个非常实用且常见的问题,尤其是在使用 Spring Boot 开发时,涉及到 Redis 客户端/操作框架 的选型与整合。我们来系统地分析:
🔍 一、先搞清楚两个东西是什么
1. spring-boot-starter-data-redis
是什么?
- 是 Spring Boot 提供的 官方 Redis Starter,属于 Spring Data Redis 的一部分。
- 它是对 Redis 操作的一个“高层封装”,基于 Jedis 或 Lettuce(默认)这两个 Redis 客户端进行二次封装,提供了一套 模板类(如 RedisTemplate、StringRedisTemplate)和 Repository 支持。
提供了什么?
- 自动配置 Redis 连接(基于 application.yml / properties)
- 提供了 RedisTemplate<K,V> 和 StringRedisTemplate 两个核心类,用于操作 Redis
- 支持 序列化/反序列化
- 支持 发布订阅、事务、Lettuce 线程安全连接池等
- 与 Spring 生态无缝集成(比如缓存注解 @Cacheable 底层可使用 Redis)
底层客户端:
- 默认使用 Lettuce(推荐,基于 Netty,异步非阻塞,线程安全)
- 也可以切换为 Jedis
依赖示例:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. org.redisson
是什么?
- 是一个 第三方高性能 Redis Java 客户端 & 分布式和高级功能框架,由 Redisson 提供。
- 它 不仅仅是一个 Redis 的 Java 驱动,而是一个“分布式和高级功能工具包”,在原生 Redis 命令基础上,封装了大量 分布式和并发相关的功能。
提供了什么?
- 基于 Netty 的 异步、高性能 Redis 客户端
- 提供 分布式锁(RedissonLock)
- 提供 分布式集合(如 Map、Set、Queue、Deque、BloomFilter 等)
- 提供 分布式对象(如 RemoteService、LiveObjectService)
- 提供 布隆过滤器、限流器、延迟队列、MapReduce 等高级功能
- 支持 Redis 集群模式、哨兵模式、主从等
- 内部也是使用 Redis 命令,但是做了更高层次的封装,简化了分布式场景下的开发
依赖示例:
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.27.2</version> <!-- 请使用最新版本 --> </dependency>
🔄 二、两者的关系与区别对比
对比维度 | spring-boot-starter-data-redis | org.redisson (redisson-spring-boot-starter) |
---|---|---|
定位 | Spring 官方对 Redis 的数据访问抽象层,提供模板和基础操作 | 第三方高性能 Redis 客户端 + 分布式工具包 |
主要用途 | 操作 Redis 键值数据,支持缓存、模板操作、与 Spring Cache 整合 | 提供 Redis 的高级功能:分布式锁、队列、集合、限流、布隆过滤器等 |
是否官方 | ✅ 是 Spring 官方维护 | ❌ 是第三方库(Redisson 项目) |
客户端实现 | 默认使用 Lettuce(也可选 Jedis) | 自己基于 Netty 实现的高性能 Redis 客户端 |
操作方式 | 提供 RedisTemplate、StringRedisTemplate,需要手动编写 key/value 操作 | 提供丰富的分布式对象 API,如 RLock、RMap、RQueue,开箱即用 |
分布式能力 | ❌ 无内置分布式锁、队列等高级功能 | ✅ 强大的分布式工具:分布式锁、队列、Map、限流器、布隆过滤器等 |
缓存注解支持 | ✅ 支持 @Cacheable、@CachePut 等(与 Spring Cache 整合) | ❌ 不直接支持,需自行实现或结合 Spring Cache |
序列化控制 | 可自定义 RedisTemplate 的序列化策略 | 内部有自己的一套序列化机制 |
适用场景 | 一般 Redis 数据读写、缓存操作、与 Spring 生态集成 | 分布式系统中的高级功能需求:锁、队列、集合、实时通信等 |
❓三、两者是否需要共存?什么时候需要同时引入?
✅ 一般情况:不需要共存!
如果你只是做 常规的 Redis 数据读写、缓存操作,比如:
- 存取 JSON 数据
- 使用
@Cacheable
注解做方法缓存 - 手动通过 RedisTemplate 操作 key-value
➤ 只使用 spring-boot-starter-data-redis 就足够了!
✅ 当你有以下“高级分布式功能”需求时,才考虑引入 Redisson:
- 你需要 分布式锁(RedissonLock)
- 你需要 分布式集合(如 RMap、RQueue、RSet、RList)
- 你需要 分布式延迟队列、消息队列
- 你需要 限流器、计数器、布隆过滤器
- 你需要 更高级的并发控制、异步/响应式 Redis 操作
➤ 这时可以引入 Redisson,它和 Spring Data Redis 并不冲突,但通常也 不需要同时使用它们的底层客户端(比如都去操作 Redis 的 key)
⚠️ 注意事项:
- 两者可以共存,但不建议同时操作同一份 Redis 数据!
- 比如你用 RedisTemplate 存了一个 key,又用 Redisson 的 RMap 去操作类似结构,容易造成混乱。
- 两者底层都连的是同一个 Redis 服务,但封装方式不同。
- 如果引入了 Redisson,而且你只需要它的高级功能(如分布式锁),可以不用 spring-boot-starter-data-redis;但如果又要缓存又要高级功能,常见方案是 保留 Spring Data Redis 做缓存,Redisson 做分布式工具。
🛠️ 四、如何配置与使用?
1. 使用 spring-boot-starter-data-redis(官方方案)
依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置(application.yml):
spring:redis:host: 127.0.0.1port: 6379password: yourpassword # 可选lettuce:pool:max-active: 8max-idle: 8min-idle: 0
使用示例:
@Autowired
private RedisTemplate<String, Object> redisTemplate;// 存数据
redisTemplate.opsForValue().set("key", "value");// 取数据
Object value = redisTemplate.opsForValue().get("key");
或者使用 String 类型专用的:
@Autowired
private StringRedisTemplate stringRedisTemplate;
如需使用 Spring Cache 注解:
@Cacheable(value = "myCache", key = "#id")
public User getUserById(String id) {// ...
}
2. 使用 Redisson(第三方分布式方案)
依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.27.2</version> <!-- 请查看最新版本 -->
</dependency>
配置(application.yml):
redisson:config: |singleServerConfig:address: "redis://127.0.0.1:6379"password: "yourpassword" # 可选database: 0threads: 16nettyThreads: 32
也可以将配置放在
redisson.yaml
文件中,放在resources/
目录下,Redisson 会自动加载。
使用示例:
注入 RedissonClient:
@Autowired
private RedissonClient redissonClient;
获取分布式锁:
RLock lock = redissonClient.getLock("myLock");
try {boolean isLocked = lock.tryLock(10, 60, TimeUnit.SECONDS);if (isLocked) {// 执行业务逻辑}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
} finally {lock.unlock();
}
使用分布式 Map:
RMap<String, String> map = redissonClient.getMap("myDistributedMap");
map.put("key", "value");
String val = map.get("key");
更多功能:RQueue(队列)、RSet、RBucket、RRateLimiter(限流)、布隆过滤器等,API 非常丰富 👍
✅ 总结推荐方案
场景 | 推荐工具 | 是否需要另一个 |
---|---|---|
只做普通 Redis 数据读写、缓存(如 @Cacheable) | ✅ spring-boot-starter-data-redis | ❌ 不需要 Redisson |
需要分布式锁、分布式集合、队列、限流等高级功能 | ✅ Redisson | ❌ 不一定需要 Spring Data Redis,但可共存 |
既要缓存又要高级功能 | ✅ 两者共存:Spring Data Redis 做缓存,Redisson 做分布式功能 | ✅ 可共存,但注意职责分离 |
🧠 小贴士
- Spring Data Redis(RedisTemplate) 更灵活,适合“精细控制”的场景,但需要手动处理序列化、操作逻辑。
- Redisson 更高级、更便捷,适合“分布式系统”中的常见模式,比如锁、队列、集合,开箱即用。
- 如果你的项目 已经用了 Spring Cache + Redis,然后想加 分布式锁,那么 引入 Redisson 是非常常见且合理的选择。