最近帮一个做上门烹饪预约服务系统的朋友排查线上缓存问题,Redis 明明连得上,业务接口也正常,但有一次活动大促时突然一批用户订单状态错乱。我在 Redis Desktop Manager 里翻了一遍缓存,看到一排 \xAC\xED\x00\x05t... 开头的 key,当时就知道问题出在哪了:Spring Boot 整合 Redis,大多数人只关心能不能 set/get,没关心数据到底是怎么存进去的。
Spring Boot 整合 Redis 的教程满大街都是,但大部分都只写到“加依赖、改配置、注入 RedisTemplate”这一步。等你真的把项目推到集群环境,序列化乱码、缓存穿透、连接池空转、Stream 消息堆积、分布式锁失效,随便一个坑都能让你加班到深夜。我今天就把这套整合流程里真正决定成败的环节完整串一遍,从服务端安装、依赖版本、序列化配置、数据类型使用,到 Stream 队列拉取和分布式锁选型,每一步都会给出实际踩坑之后沉淀下来的做法。
1. 版本选择与Redis服务端准备:先让连接能通
1.1 依赖引入和版本匹配:照着老教程写代码容易翻车
Spring Boot 整合 Redis 的时候,常规第一步是引入 spring-boot-starter-data-redis。这个起步依赖会把 Spring Data Redis 和 Lettuce 连接池一起带进来,非常简单:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
但如果你在一个老项目里手动指定过版本,或者引入了一堆第三方组件,版本冲突就会变成第一个坑。最典型的一个组合是 springfox 3.0.0 + Spring Boot 2.6+,很多项目集成 Redis 的同时还要接 Swagger 文档,结果项目启动时出现路径匹配异常,或者报一些和 Redis 一点关系都没有的类找不到错误。
Spring Boot 2.6 之后,Spring MVC 的路径匹配策略从 AntPathMatcher 换成了 PathPatternParser,而 springfox 3.0.0 还停留在老的方式上,所以启动时容易 NPE。这类问题排查起来非常迷惑,因为它表面上和 Redis 无关,实际上是你把所有中间件堆在一起时才会暴露。
我的建议是:
- 新项目直接用 Spring Boot 2.7.x 或 3.x,API 文档用
springdoc-openapi,彻底绕开 springfox 兼容性问题; - 老项目如果必须用 springfox,就把 Spring Boot 锁在 2.5.x,别为了升级而升级;
- 一旦引入 Redis,先把
spring-boot-starter-data-redis的版本和 Spring Boot 父 POM 对齐,不要单独指定版本,否则容易出现低层 API 不兼容。
1.2 Windows 本地开发环境:下载 Redis 后这样启动最省心
做本地开发时,很多人会问 Redis 到底怎么下。如果你在 Windows 上工作,最简单的方式是直接下载 Redis 的 Windows 压缩包,解压后会有 redis-server.exe 和 redis-cli.exe,还有一份默认配置文件。
你只需要做三件事:
bash复制# 先启动服务端,默认端口 6379
redis-server.exe
# 再开一个命令行窗口,测试连通性
redis-cli ping
如果返回 PONG,说明服务端正常。要注意的是,官方 Redis 其实不提供 Windows 版本,Windows 下的包基本是社区维护的移植版。如果公司内部允许用 Docker,我更推荐走 Docker 方案,少踩很多跨平台兼容性的坑。
1.3 用 Docker 搭建 Redis 主从:本地模拟生产环境
从热搜词里能看到“docker 安装 redis 主从”是被搜爆的话题。原因很简单,生产环境你几乎不可能用单机 Redis,一旦主节点宕机,从节点顶上,这就是最基础的高可用架构。用 Docker 搭主从非常快:
bash复制# 创建主节点
docker run -d --name redis-master -p 6379:6379 redis:7.2 redis-server --appendonly yes
# 创建从节点,从节点不需要暴露到宿主机,容器网络互通即可
docker run -d --name redis-slave --link redis-master redis:7.2 redis-server --replicaof redis-master 6379
进去验证一下主从是否同步:
bash复制docker exec -it redis-slave redis-cli info replication
看到 role:slave 和 master_link_status:up,就说明从节点成功连上主节点了。这里有一个关键点:从节点默认是只读的,不要在业务代码里往从节点写数据。后面在 Spring Boot 侧要配置读写分离,或者干脆用 Redis Sentinel / Redis Cluster 来管理节点切换,而不是傻傻地手动改 IP。
1.4 Spring Boot 连接配置:环境不同配置写法有差异
Spring Boot 2.x 里 Redis 的配置项前缀是 spring.redis,Spring Boot 3.x 改成了 spring.data.redis。如果你跟着网上的教程抄,很容易因为版本差异导致配置没生效。
以 Spring Boot 2.7 为例:
yaml复制spring:
redis:
host: 127.0.0.1
port: 6379
password: yourpassword
database: 0
timeout: 3000ms
如果是 Spring Boot 3.x:
yaml复制spring:
data:
redis:
host: 127.0.0.1
port: 6379
password: yourpassword
database: 0
timeout: 3000ms
改完配置之后,跑通一个最简单的验证接口,确认 RedisTemplate 能正常写入和读取。如果这一步能过,说明服务端、客户端、网络层面都没有问题,后面才进入真正的“高手区间”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 序列化器配置:可视化工具里不再是乱码的关键
2.1 默认 JDK 序列化器到底可怕在哪
Spring Boot 的 RedisAutoConfiguration 默认会创建一个 RedisTemplate<Object, Object>,这个模板默认用的序列化器是 JdkSerializationRedisSerializer。Java 默认序列化会把对象序列化成二进制字节,再存到 Redis 里。你如果用 Redis Desktop Manager 或者 Another Re
