平时做Java开发,只要引入Redis做缓存,pom.xml里总会看到一堆名字相似的东西:一会儿是jedis,一会儿是lettuce,还有Spring Data Redis、Redisson、Spring Session Redis……
刚接触的时候真的头大,甚至会把Redis服务端和Java客户端混为一谈,踩了不少坑。
今天就把这些东西理清楚,分清谁是底层、谁是封装、谁是专门解决某个场景的。
其实,这些东西根本不是平级的,而是有明确的上下层级依赖关系,从底层到上层的完整链路是:

先讲清每个东西的定位:
- Redis
就是你装在服务器上的NoSQL数据库(服务端),所有东西最终都要和它打交道。
- Jedis、Lettuce、Redisson
都是Java连接Redis服务端的客户端,只是定位和特性不同。
- Spring Data Redis
Spring对Java客户端做的统一封装,屏蔽底层差异,让你用一套API就能操作Redis。
- Spring Session Redis
基于Spring Data Redis做的专项场景组件,只干1件事:解决分布式系统的Session共享问题。
Redis 本身
首先,所有东西的核心,就是Redis——它是一个独立跑在服务器上的键值对NoSQL数据库,也就是我们常说的Redis服务端。
它完全独立于Java程序,你用Java、Python、Go都能连接它,和jedis这些Java客户端没有任何强绑定,作用就是提供数据存储、缓存、发布订阅、计数器这些能力。
Java客户端:Jedis、Lettuce、Redisson
这三个都是Java语言实现的Redis客户端,作用就是让Java程序通过TCP连接Redis服务端、发送命令、接收结果,项目里选其一即可,不用全引。
1. Jedis
Jedis应该是Java生态里最早流行的Redis客户端了,最大的特点就是轻量、简单,API完全贴合Redis的原生命令。
它的底层是阻塞式、直连模型:
每个连接对应一个物理TCP连接,多线程环境下是线程不安全的,所以多线程场景用的时候,必须搭配连接池使用。
适用场景
小项目、简单的Redis缓存场景,对性能没有极致要求,就想快速上手用Redis,选Jedis完全够用。
小贴士
Spring Boot 1.x版本,Spring Data Redis默认的客户端就是Jedis,2.x之后换成了Lettuce。
2. Lettuce
现在用Spring Boot 2.x/3.x,只要引了redis的starter,默认集成的就是Lettuce,它是基于Netty实现的非阻塞、响应式客户端。
和Jedis最大的区别就是:
它是线程安全的,一个连接实例就能在多线程环境下安全使用,不用额外配置连接池;
底层用Netty的NIO模型,支持异步、响应式编程,高并发场景下的性能比Jedis好很多,同时也完美支持Redis哨兵、集群、管道这些高级特性。
适用场景
高并发、需要异步操作Redis的场景,还有Spring WebFlux响应式编程项目。
Redisson
Jedis和Lettuce的核心是:
封装Redis命令,让你能操作Redis。
而Redisson是基于Redis,实现了大量分布式系统的高级功能,是一个更重量级的客户端。
Redisson底层也是基于Netty实现的非阻塞模型。
它的优势是提供了一整套贴合Java并发编程API的分布式工具:
比如业内最常用的分布式锁(可重入锁、公平锁)、分布式信号量、分布式队列、分布式Map/List,甚至还有分布式限流、分布式ID生成这些功能。
适用场景
项目里需要用分布式锁、分布式队列这些高级分布式功能的时候,首选Redisson。
Spring Data Redis
Spring Data Redis本身不具备连接Redis的能力,它只是对底层的Java客户端做了一层统一封装,是Spring Data家族的一员,专门用来在Spring/Spring Boot项目里简化Redis操作,作用就是:
屏蔽Jedis、Lettuce这些不同客户端的底层API差异,给你提供了一套统一的操作API——就是我们最常用的RedisTemplate、StringRedisTemplate。
它和客户端的关系:
Spring Data Redis是上层封装,Jedis/Lettuce/Redisson是底层实现,必须选一个底层客户端,它才能正常工作。
适用场景
只要是Spring/Spring Boot项目,用Redis就必用Spring Data Redis,这是Spring生态里操作Redis的标准方式,能极大简化代码,不用关心底层客户端的细节。
Spring Session Redis
这个就更上层了,很多人会把它和Spring Data Redis混为一谈,其实它俩根本不是一个维度的东西:
Spring Data Redis是通用的Redis操作封装,而Spring Session Redis只干分布式Session共享这一件事。
传统单体项目里,Session是存在Tomcat容器里的,但是分布式微服务项目里,一个用户的请求可能会打到不同的服务节点上,A节点存的用户登录Session,B节点根本拿不到,就会出现用户登录了一次,刷新一下就需要重新登录的问题。
最常用的解决方案,就是把Session统一存在Redis里,所有服务节点都从Redis里读写Session,就能实现跨节点的Session共享了。
而Spring Session Redis,就是把“Session存Redis、从Redis取Session、过期时间管理、销毁”这一整套逻辑,完全给你封装好了。
你不用写任何业务代码,只要引入依赖、加几行简单配置,就能实现分布式Session共享,而且对业务代码完全无侵入。
适用场景
分布式微服务项目里,需要实现跨节点的Session共享、单点登录,用它非常方便,几行配置就能搞定,不用自己手写逻辑。