1、使用Spring Boot 连接 Redis 单机

1.1 创建项目

勾选 NoSQL 中的 Spring Data Redis
当然, 把 Web 中的 Spring Web 也勾选⼀下. ⽅便写接⼝进⾏后续测试.
![创建项目](https://i-blog.csdnimg.cn/direct/94cb9e60177a49cdadba6bd550f18dc5.png
创建项目

1.2 依赖说明

项目创建后,pom.xml 会自动引入 Redis 相关依赖,核心依赖如下:

<!-- Spring Data Redis 核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 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 提供 RedisTemplateStringRedisTemplate 两种模板类:

  • 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
    @Autowired
    private 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):获取索引 startend 的元素(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);  // 分数 100
    redisTemplate.opsForZSet().add("test:zset", "赵云", 98);   // 分数 98
    redisTemplate.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):按分数升序获取索引 startend 的元素;
  • count(key, min, max):统计分数在 minmax 之间的元素个数。

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:6379
    lettuce:  # 自动刷新集群拓扑(感知节点新增/宕机)
      cluster:
        refresh:
          adaptive: true  # 自适应刷新(节点变化时触发)
          period: 2000    # 定时刷新周期(毫秒)

关键配置说明

  • cluster.nodes:配置集群所有节点地址,Spring Boot 会自动发现集群主从关系;
  • lettuce.cluster.refresh:开启集群拓扑自动刷新,避免因节点宕机导致连接失效。

3.2 集群部署注意事项

  1. 环境限制:文档中集群节点使用 Docker 容器 IP(如 172.30.0.101),Windows 主机无法直接访问,需将项目打包为 JAR 包,上传到 Linux 服务器执行;
  2. 打包与运行
    • 在 IDEA 中通过 Maven → package 打包项目,生成 JAR 文件;
    • 上传 JAR 到 Linux 服务器,执行命令 java -jar 项目名.jar 启动项目;
  3. 兼容性:集群模式下,StringRedisTemplate 的用法与单机完全一致,无需修改之前编写的接口代码。

4、核心差异:Spring Data Redis vs 原生 Jedis

在之前的文档中,我们使用过 Jedis 客户端操作 Redis,而 Spring Boot 集成的 Spring Data Redis 与原生 Jedis 存在以下差异:

对比维度 原生 Jedis Spring Data Redis(StringRedisTemplate)
方法命名 与 Redis 命令完全一致(如 hsetsadd 方法名更贴近 Java 语义(如 putadd
序列化 需手动处理 默认 String 序列化(UTF-8),无需手动处理
连接管理 需手动创建连接池 自动管理连接池(Lettuce),无需手动关闭
集群支持 需使用 JedisCluster 只需配置 cluster.nodes,自动支持集群
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐