spring boot 2.7+ 默认使用 lettuce,因其基于 netty、支持响应式、线程安全且自动管理连接池;强行切换 jedis 会丢失优势并增加配置负担,且 spring boot 3.x 已彻底移除 jedis 支持。

Spring Boot 2.7+ 默认用 Lettuce,别硬切 Jedis
Spring Boot 2.0 起就默认集成 Lettuce 作为 Redis 客户端,不是 Jedis。强行换 Jedis 不仅要排除依赖、重写配置,还会丢掉连接池自动管理、响应式支持和线程安全保障。
- 如果你只是想用
redisTemplate.opsForValue().set()这类操作,Lettuce完全够用,且更轻量 -
Jedis是阻塞式、多线程下需自己管连接池(JedisPool),而Lettuce基于 Netty,单连接可并发处理,LettucePoolingClientConfiguration才是它的池化方式 - 若项目已用
Jedis且有历史封装,升级到 Spring Boot 3.x 后会直接报ClassNotFoundException: redis.clients.jedis.Jedis—— 因为 spring-boot-starter-data-redis 3.x 已彻底移除 Jedis 支持
application.yml 里只配 host 和 port 就能连上?先看 Redis 服务状态
很多连不上根本不是配置问题,而是 Redis 没在监听外部请求,或者被防火墙拦了。
- 检查 Redis 是否启用了
bind:本地开发默认只绑127.0.0.1,远程服务器要改成0.0.0.0或具体内网 IP,否则Connection refused不是 Spring 的错 - Docker 部署时,别只写
host: redis就以为万事大吉——确认容器网络互通,docker exec -it your-app ping redis要通 - Redis 6+ 默认开启密码认证,但 Spring Boot 的
spring.redis.password配置项必须显式写,空字符串也不行;漏配会卡在NOAUTH Authentication required
RedisTemplate 的 key 序列化策略不改,存进去全是乱码
RedisTemplate 默认用 JdkSerializationRedisSerializer,序列化后 key 和 value 都是二进制,redis-cli 里看到类似 \xac\xed\x00\x05t\x00\x03foo,根本没法 debug。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 开发阶段建议统一用
StringRedisTemplate,它默认用StringRedisSerializer,key/value 都是明文可读 - 如果必须用
RedisTemplate(比如存对象),至少把 key 的序列化器换成StringRedisSerializer:template.setKeySerializer(new StringRedisSerializer()) - value 序列化器可选
GenericJackson2JsonRedisSerializer(兼容性好)或GenericToStringSerializer(适合简单类型),但别用Jackson2JsonRedisSerializer——它要求泛型在构造时固定,运行时类型擦除后容易反序列化失败
@Cacheable 失效?检查 RedisTemplate 和 CacheManager 是不是同一套配置
写了 @Cacheable(cacheNames = "user") 却没走 Redis,大概率是 CacheManager 和你手写的 RedisTemplate 指向了不同连接或序列化器。
- Spring Boot 自动配置的
RedisCacheManager默认复用redisTemplatebean,但如果你手动定义了RedisTemplatebean 却没加@Primary,它可能被忽略,导致缓存走的是默认(JDK 序列化)那套 - 确认
CacheManager实际用的序列化器:打印cacheManager.getCache("user").getNativeCache()类型,再查其getValueSerializer(),和你的RedisTemplate对齐 - 如果用了
@EnableCaching但没配spring.cache.type=redis,Spring Boot 会 fallback 到SimpleCacheManager(内存级),压根不碰 Redis
真正卡住人的往往不是怎么写,而是 Redis 连接是否真通、序列化是否一致、缓存组件是否真的被激活——这些地方一错,日志里几乎不报错,只会静默失效。










