Redis Java 集成到 Spring Boot
1、使用Spring Boot 连接 Redis 单机
1.1 创建项目
勾选 NoSQL 中的 Spring Data Redis
当然, 把 Web 中的 Spring Web
也勾选⼀下. ⽅便写接⼝进⾏后续测试.
 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
- spring-boot-starter-data-redis:封装了 Redis 连接池、数据类型操作等功能,默认使用Lettuce 客户端(线程安全,性能优于传统 Jedis);
- 无需额外引入 Redis 驱动,依赖已内置。
1.3 配置 redis 服务地址
在 src/main/resources
目录下,找到 application.yml
(若为 application.properties
,可改为 YAML 格式,更易读),添加 Redis 连接配置:
spring:redis:host: 127.0.0.1 # Redis 服务器地址(本地)port: 8888 # 端口号(文档中通过端口转发映射云服务器 6379 到本地 8888)# 可选配置:密码(若 Redis 设了密码,需添加 password: your_password)# password: 123456# 连接池配置(Lettuce 默认,无需额外配置,按需调整)lettuce:pool:max-active: 8 # 最大连接数max-idle: 8 # 最大空闲连接数min-idle: 2 # 最小空闲连接数
- 若 Redis 部署在云服务器,需先通过 Xshell 等工具配置端口转发(本地 8888 映射服务器 6379),避免直接暴露 6379 端口导致安全风险;
- 配置完成后,Spring Boot 会自动创建 Redis 连接池和操作模板。
1.4 核心操作类:StringRedisTemplate
Spring Data Redis 提供 RedisTemplate
和 StringRedisTemplate
两种模板类:
RedisTemplate
:支持泛型,可操作任意类型数据,但需手动序列化(默认 JDK 序列化,可读性差);StringRedisTemplate
:专门用于操作 String 类型数据,默认使用 String 序列化(UTF-8),数据在 Redis 中可读性高,文档推荐使用此类。
使用方式:在 Controller 或 Service 中通过 @Autowired
注入 StringRedisTemplate
:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController // 标记为控制器,处理 HTTP 请求
public class RedisController {// 注入 StringRedisTemplate,用于操作 Redis@Autowiredprivate StringRedisTemplate redisTemplate;// 后续数据类型操作接口将在这里编写
}
2、实战:五大数据类型操作(基于接口测试)
接下来,通过编写 HTTP 接口,分别实现 String、List、Hash、Set、ZSet 的核心操作,可通过 Postman 或浏览器访问接口测试。
2.1 String 类型:键值对存储
String 是 Redis 最基础的类型,适合存储单个字符串(如缓存用户信息、验证码等)。
接口实现
/*** 测试 String 类型操作:set、get、delete*/
@GetMapping("/testString") // GET 请求路径:http://localhost:8080/testString
@ResponseBody // 返回纯文本结果
public String testString() {// 1. 存储键值对:key = "test:str", value = "SpringBoot-Redis"redisTemplate.opsForValue().set("test:str", "SpringBoot-Redis");// 2. 获取键值String value = redisTemplate.opsForValue().get("test:str");System.out.println("String 取值结果:" + value); // 控制台输出:SpringBoot-Redis// 3. 删除键redisTemplate.delete("test:str");return "String 操作成功!取值结果:" + value;
}
测试方式
启动 Spring Boot 项目,在浏览器访问 http://localhost:8080/testString
,页面返回 String 操作成功!取值结果:SpringBoot-Redis
,控制台同步输出取值结果,说明操作生效。
2.2 List 类型:有序可重复集合
List 基于双向链表实现,适合存储有序数据(如消息队列、最新消息列表),支持从两端插入/获取元素。
接口实现
/*** 测试 List 类型操作:leftPush、leftPushAll、range、delete*/
@GetMapping("/testList")
@ResponseBody
public String testList() {// 1. 从左侧插入单个元素:key = "test:list",元素 = "a"redisTemplate.opsForList().leftPush("test:list", "a");// 2. 从左侧批量插入元素:"b", "c", "d"(最终列表顺序:d -> c -> b -> a)redisTemplate.opsForList().leftPushAll("test:list", "b", "c", "d");// 3. 获取指定范围元素:索引 1 到 2(闭区间,结果:c, b)List<String> values = redisTemplate.opsForList().range("test:list", 1, 2);System.out.println("List 取值结果:" + values); // 控制台输出:[c, b]// 4. 删除键redisTemplate.delete("test:list");return "List 操作成功!取值结果:" + values;
}
关键方法说明
leftPush(key, value)
:从列表左侧(头部)插入元素;leftPushAll(key, values)
:批量从左侧插入元素;range(key, start, end)
:获取索引start
到end
的元素(end = -1
表示获取所有元素)。
2.3 Hash 类型:字段-值映射(对象存储)
Hash 适合存储对象类数据(如用户信息、商品属性),每个 Hash 可包含多个字段(field),字段唯一且对应一个值(value)。
接口实现
/*** 测试 Hash 类型操作:put、get、hasKey、delete*/
@GetMapping("/testHash")
@ResponseBody
public String testHash() {// 1. 存储 Hash 字段:key = "test:hash",field = "name",value = "zhangsan"redisTemplate.opsForHash().put("test:hash", "name", "zhangsan");// 2. 获取指定字段的值String name = (String) redisTemplate.opsForHash().get("test:hash", "name");System.out.println("Hash 取值结果(name):" + name); // 控制台输出:zhangsan// 3. 删除指定字段redisTemplate.opsForHash().delete("test:hash", "name");// 4. 判断字段是否存在(删除后应为 false)boolean hasName = redisTemplate.opsForHash().hasKey("test:hash", "name");System.out.println("Hash 字段是否存在(name):" + hasName); // 控制台输出:false// 5. 删除键redisTemplate.delete("test:hash");return "Hash 操作成功!name 取值:" + name + ",字段是否存在:" + hasName;
}
关键方法说明
put(key, field, value)
:为 Hash 插入一个字段-值对;get(key, field)
:获取指定字段的值(返回 Object,需强转为 String);hasKey(key, field)
:判断 Hash 中是否存在指定字段;delete(key, fields)
:删除 Hash 中的一个或多个字段。
2.4 Set 类型:无序唯一集合
Set 是无序、唯一的字符串集合,适合存储不重复的数据(如用户标签、好友列表),支持交集、并集等集合运算。
接口实现
/*** 测试 Set 类型操作:add、isMember、remove、size*/
@GetMapping("/testSet")
@ResponseBody
public String testSet() {// 1. 向 Set 中添加元素:key = "test:set",元素 = "aaa", "bbb", "ccc"(自动去重)redisTemplate.opsForSet().add("test:set", "aaa", "bbb", "ccc");// 2. 判断元素是否在 Set 中boolean hasAaa = redisTemplate.opsForSet().isMember("test:set", "aaa");System.out.println("Set 是否包含 aaa:" + hasAaa); // 控制台输出:true// 3. 删除 Set 中的元素redisTemplate.opsForSet().remove("test:set", "aaa");// 4. 获取 Set 的元素个数(删除后应为 2)long size = redisTemplate.opsForSet().size("test:set");System.out.println("Set 元素个数:" + size); // 控制台输出:2// 5. 删除键redisTemplate.delete("test:set");return "Set 操作成功!是否包含 aaa:" + hasAaa + ",剩余元素数:" + size;
}
关键方法说明
add(key, values)
:向 Set 中添加一个或多个元素(自动去重);isMember(key, value)
:判断元素是否在 Set 中;size(key)
:获取 Set 的元素总数。
2.5 ZSet 类型:有序唯一集合(带分数)
ZSet(Sorted Set)是有序、唯一的集合,每个元素关联一个“分数(score)”,通过分数排序,适合实现排行榜、优先级队列。
接口实现
/*** 测试 ZSet 类型操作:add、range、count、delete*/
@GetMapping("/testZSet")
@ResponseBody
public String testZSet() {// 1. 向 ZSet 中添加元素(带分数):key = "test:zset"redisTemplate.opsForZSet().add("test:zset", "吕布", 100); // 分数 100redisTemplate.opsForZSet().add("test:zset", "赵云", 98); // 分数 98redisTemplate.opsForZSet().add("test:zset", "典韦", 95); // 分数 95// 2. 按分数升序获取指定范围元素:索引 0 到 2(结果:典韦、赵云、吕布)Set<String> values = redisTemplate.opsForZSet().range("test:zset", 0, 2);System.out.println("ZSet 升序取值结果:" + values); // 控制台输出:[典韦, 赵云, 吕布]// 3. 统计分数在 95-100 之间的元素个数(结果:3)long count = redisTemplate.opsForZSet().count("test:zset", 95, 100);System.out.println("ZSet 分数 95-100 元素数:" + count); // 控制台输出:3// 4. 删除键redisTemplate.delete("test:zset");return "ZSet 操作成功!升序元素:" + values + ",分数 95-100 元素数:" + count;
}
关键方法说明
add(key, value, score)
:向 ZSet 中添加元素,指定分数;range(key, start, end)
:按分数升序获取索引start
到end
的元素;count(key, min, max)
:统计分数在min
到max
之间的元素个数。
3、Spring Boot 连接 Redis 集群
生产环境中 Redis 通常以集群模式部署(高可用、分片存储),Spring Boot 只需修改配置即可支持集群,无需改动业务代码。
3.1集群配置(application.yml)
spring:redis:cluster:nodes: # 集群所有节点的 IP:端口(文档中为 Docker 容器 IP)- 172.30.0.101:6379- 172.30.0.102:6379- 172.30.0.103:6379- 172.30.0.104:6379- 172.30.0.105:6379- 172.30.0.106:6379- 172.30.0.107:6379- 172.30.0.108:6379- 172.30.0.109:6379lettuce: # 自动刷新集群拓扑(感知节点新增/宕机)cluster:refresh:adaptive: true # 自适应刷新(节点变化时触发)period: 2000 # 定时刷新周期(毫秒)
关键配置说明
cluster.nodes
:配置集群所有节点地址,Spring Boot 会自动发现集群主从关系;lettuce.cluster.refresh
:开启集群拓扑自动刷新,避免因节点宕机导致连接失效。
3.2 集群部署注意事项
- 环境限制:文档中集群节点使用 Docker 容器 IP(如 172.30.0.101),Windows 主机无法直接访问,需将项目打包为 JAR 包,上传到 Linux 服务器执行;
- 打包与运行:
- 在 IDEA 中通过
Maven → package
打包项目,生成 JAR 文件; - 上传 JAR 到 Linux 服务器,执行命令
java -jar 项目名.jar
启动项目;
- 在 IDEA 中通过
- 兼容性:集群模式下,
StringRedisTemplate
的用法与单机完全一致,无需修改之前编写的接口代码。
4、核心差异:Spring Data Redis vs 原生 Jedis
在之前的文档中,我们使用过 Jedis 客户端操作 Redis,而 Spring Boot 集成的 Spring Data Redis
与原生 Jedis 存在以下差异:
对比维度 | 原生 Jedis | Spring Data Redis(StringRedisTemplate) |
---|---|---|
方法命名 | 与 Redis 命令完全一致(如 hset 、sadd ) | 方法名更贴近 Java 语义(如 put 、add ) |
序列化 | 需手动处理 | 默认 String 序列化(UTF-8),无需手动处理 |
连接管理 | 需手动创建连接池 | 自动管理连接池(Lettuce),无需手动关闭 |
集群支持 | 需使用 JedisCluster 类 | 只需配置 cluster.nodes ,自动支持集群 |