接手过不少Spring Boot项目,Redis基本上是绕不开的那一个中间件。很多人觉得Spring Boot整合Redis简单,无非加个依赖、配置连接信息、注入RedisTemplate就能用了,但实际项目里踩过的坑远比想象中多——序列化乱码、连接池参数不合适、缓存穿透把数据库打挂、分布式锁失效导致超卖……这些问题几乎每个团队都会遇到。
这篇文章我想从一个实际项目开发者的角度,把Spring Boot整合Redis的完整过程拆开讲一遍。包括环境准备、基础配置、序列化方案、数据类型选型、分布式锁、Stream队列消息拉取,以及我在生产环境里遇到的各种问题排查思路。内容适合刚上手Spring Boot + Redis的新手,也适合已经在项目里用了Redis但想进一步规范用法的开发者。
1. 整合前的思路梳理:先搞清楚Redis在项目里解决什么问题
1.1 Redis在Spring Boot项目里的四个典型位置
在做整合之前,我建议你先想清楚一个问题:Redis在你的项目里到底承担什么角色?我经手的项目里,Redis基本跑不出这四个位置:
缓存。这是最普遍的使用场景。热点商品信息、用户资料、配置数据、验证码、登录Token,都可以塞进Redis。缓存的本质是用空间换时间,把数据库的压力分担出去。
分布式锁。当服务从单机部署变成多实例集群时,Java自带的synchronized和Lock就失效了——多台机器之间没法共享一把锁。Redis的分布式锁可以解决多个服务实例之间的并发互斥问题。
消息队列。Redis 5.0之后引入了Stream数据结构,支持消费者组,可以做轻量级的消息队列。虽然功能上不如Kafka、RabbitMQ那么完整,但胜在轻量,很多中小型项目直接用Redis Stream就能满足需求。
计数器与排行榜。Redis的单线程模型和INCR命令天然适合做计数器,比如点赞数、访问量、库存扣减。ZSet(有序集合)则是排行榜场景的首选。
搞清楚Redis在项目里的定位,你才能知道后续做配置时需要关注哪些重点。如果只是做缓存,配置相对简单;如果要做分布式锁,就要额外关注原子性和安全性问题。
1.2 为什么选择Redis而不是本地缓存
很多项目初期为了省事,直接在服务里用ConcurrentHashMap或者Caffeine做本地缓存。这种方式确实快,因为数据就在本机内存里,没有网络开销。但问题随着服务扩容立即暴露:两台服务实例各有各的缓存,用户请求落到不同实例上,看到的数据可能不一致。
我举一个实际例子。某个管理后台系统把用户权限信息放进了Caffeine本地缓存,过期时间设置了5分钟。后来服务从单机扩到两台,问题就来了:管理员在A实例上修改了某个用户的角色权限,B实例上的缓存还是5分钟前的旧数据,用户反馈“权限改了没生效”。排查到最后,才发现是本地缓存各存各的导致数据不一致。
Redis作为集中式缓存,天然规避了这个问题。不管请求落在哪台实例上,读到的都是同一份Redis数据。再加上Redis本身支持持久化(RDB和AOF两种方式),即使Redis重启,数据也能恢复,不会像纯本地缓存那样一重启就丢失。
还有一点,Redis自带过期机制。你可以给每个key设置TTL(Time To Live),到了时间自动删除,完全不需要业务代码里额外维护定时清理任务。而本地缓存虽然Caffeine也支持过期,但缺乏统一管理。
1.3 整合方式选型:Spring Data Redis、Redisson与Jedis
Spring Boot生态下接入Redis,主流的方案有三条路:
Spring Data Redis。这是Spring官方提供的数据操作封装,也是绝大多数Spring Boot项目的默认选择。它提供了RedisTemplate和StringRedisTemplate两个模板类,封装了连接管理、序列化、事务、管道等底层细节,开发者只需要调用方法即可。Spring Boot 2.x之后默认使用Lettuce作为连接客户端。
Redisson。这是一款基于Redis实现的Java驻内存数据网格框架,提供了大量分布式数据结构,比如分布式锁、分布式集合、分布式消息队列等。它的核心优势是让你在代码里像使用本地集合一样使用分布式对象,分布式锁的实现也极其完整,支持看门狗自动续期,解决了我后面会讲到的锁过期问题。
Jedis。最老的Redis Java客户端,底层直接基于Socket连接实现,API非常薄。它的缺点是线程不安全,一个Jedis实例不能多线程共享,需要配合连接池使用。现在新项目里直接用Jedis的越来越少了,但很多老项目还在用。
我的建议是:普通项目用Spring Data Redis就够,如果涉及复杂的分布式锁场景,可以再引入Redisson。两者并不互斥,Redisson作为补充工具使用很常见。Jedis目前只适合维护老项目时使用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:Redis安装与连接工具选型
2.1 Windows环境快速安装Redis
Redis官方并不直接支持Windows,但微软曾经维护过一个Windows移植版,现在社区里流传最广的是tporadowski的Redis for Windows版本,以及Memurai等替代方案。开发环境下,Windows玩家最常见的做法是直接下载Redis的zip压缩包解压使用。
我建议下载时注意版本,尽量选择5.0以上版本,因为Redis 5.0引入了Stream数据结构,后面讲消息队列时会用到。下载完解压后,目录里会有这些关键文件:
redis-server.exe:服务端程序redis-cli.exe:命令行客户端redis.windows.conf:配置文件redis.windows-service.conf:注册为Windows服务用的配置
启动方式很简单,双击redis-server.exe即可,默认端口6379。但这样有个问题:Redis以前台方式运行,关掉窗口Redis就停了。我习惯用命令行方式注册为Windows服务:
bat复制redis-server.exe --service-install redis.windows-service.conf --loglevel verbose
redis-server.exe --service-start
注册成功后,Windows服务列表里会出现Redis服务,开机自启,省心很多。需要注意的是,Windows版Redis在性能上不如Linux版,生产环境建议部署在Linux服务器上,Windows只用来做开发调试。
2.2 Docker方式安装Redis(推荐)
如果你本机装了Docker,那安装Redis就简单多了。开发环境、测试环境、生产环境都可以用同样的镜像,环境一致性最好,我强烈推荐这种方式。
一条命令就能拉取并启动Redis:
bash复制docker run -d --name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
redis:7.0 redis-server /etc/redis/redis.conf
这里简单拆解一下参数:
-d:后台运行--name redis:容器命名为redis,方便后续管理-p 6379:6379:宿主机6379端口映射到容器6379端口-v:数据目录和配置文件的挂载,这一步很重要。如果不挂载数据目录,容器删除后Redis里的数据全没了;不挂载配置文件,你就没法方便地修改Redis参数
启动后可以用docker exec -it redis redis-cli ping验证一下,返回PONG基本就说明Redis起来了。
注意,容器内的Redis默认没有密码,而且直接使用了默认配置。如果是本地开发无所谓,但如果是在服务器上,一定要设置密码或者修改默认端口,避免被扫描攻击。
2.3 Redis连接可视化工具的选择
日常开发时,光靠命令行redis-cli看数据效率太低。我常
