当前位置:首页 > 学海无涯 > 正文内容

Spring Boot 配置 Redis 入门指南:从环境搭建到实战操作

清羽天1个月前 (09-15)学海无涯6

Spring Boot 配置 Redis 入门指南:从环境搭建到实战操作

**
Redis 作为一款高性能的键值对存储数据库,在缓存、会话存储、分布式锁等场景中应用广泛。而 Spring Boot 凭借其 “约定优于配置” 的特性,能极大简化 Redis 的集成流程。本文将从零基础出发,带大家一步步完成 Spring Boot 与 Redis 的整合,包括环境准备、依赖配置、代码实现和常见问题解决,非常适合刚接触 Redis 的开发者。

一、前置知识与环境准备

在开始配置前,我们需要确保本地环境满足以下条件,避免后续出现兼容性问题:

1.1 必备环境清单

工具 / 框架
推荐版本
说明
JDK
1.8 或 11
Spring Boot 2.x 对 JDK 1.8+ 支持更稳定
Spring Boot
2.x(本文以 2.7.10 为例)
3.x 版本配置逻辑类似,依赖坐标略有差异
Redis 服务器
5.x 或 6.x
本地安装或使用云服务器 Redis(如阿里云)
开发工具
IntelliJ IDEA 或 Eclipse
推荐 IDEA,自带 Spring 插件支持
构建工具
Maven 3.6+ 或 Gradle 7.x
本文以 Maven 为例讲解依赖配置

1.2 Redis 服务器准备(本地版)

如果还未安装 Redis,可按照以下步骤快速搭建本地环境(以 Windows 系统为例):
  1. Redis 官网 下载 Windows 版本压缩包(或通过 GitHub 镜像 下载);

  1. 解压压缩包到本地目录(如 D:\Redis);

  1. 打开命令提示符(CMD),进入 Redis 解压目录,执行启动命令:

# 临时启动(关闭 CMD 后 Redis 停止)redis-server.exe redis.windows.conf
  1. 验证 Redis 是否启动成功:打开新的 CMD 窗口,执行以下命令,若返回 PONG 则表示启动正常:

redis-cli.exe -h 127.0.0.1 -p 6379 ping

二、创建 Spring Boot 项目并引入 Redis 依赖

2.1 初始化 Spring Boot 项目

有两种方式创建项目,新手推荐使用 Spring Initializr 可视化工具:
  1. 访问 Spring Initializr 官网;

  1. 配置项目基本信息(如下表),然后点击 Generate 下载项目压缩包;

配置项
取值建议
Project
Maven Project
Language
Java
Spring Boot
2.7.10
Group
com.example(自定义)
Artifact
spring-boot-redis-demo
Package name
com.example.redisdemo
Packaging
Jar
Java
8
  1. 将下载的压缩包解压,用 IDEA 打开项目(选择 Open -> 找到项目目录 -> 等待 Maven 依赖加载完成)。

2.2 引入 Redis 依赖

Spring Boot 提供了专门的 Redis starter 依赖,无需手动引入复杂的 Redis 客户端 Jar 包。打开项目的 pom.xml 文件,在 <dependencies> 标签中添加以下依赖:
<!-- Spring Boot Redis starter(核心依赖) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot Web 依赖(可选,用于后续接口测试) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 连接池依赖(可选,提升 Redis 连接效率) --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
  • spring-boot-starter-data-redis:自动集成 Redis 客户端(默认使用 Lettuce,2.x 版本已替代 Jedis 作为默认客户端);

  • commons-pool2:Lettuce 客户端依赖的连接池组件,用于管理 Redis 连接,避免频繁创建 / 销毁连接带来的性能损耗;

  • spring-boot-starter-web:后续通过接口测试 Redis 功能时需要,若仅做本地测试可省略。

添加依赖后,点击 IDEA 右上角的 Maven 刷新按钮,确保依赖下载完成。

三、编写 Redis 核心配置

Spring Boot 会自动加载 Redis 的默认配置,但实际开发中我们需要根据自己的 Redis 服务器信息(如地址、端口、密码)自定义配置。

3.1 配置文件(application.properties 或 application.yml)

Spring Boot 支持两种配置文件格式,这里以更简洁的 application.yml 为例(若项目中是 application.properties,可直接重命名为 application.yml),在 src/main/resources 目录下编写配置:
# Spring 相关配置spring:# Redis 配置redis:# Redis 服务器地址(本地默认 127.0.0.1,远程服务器填实际 IP)host: 127.0.0.1# Redis 端口号(默认 6379,若修改过需对应调整)port: 6379# Redis 密码(若未设置密码,可省略此配置)password: 123456  # 注意:生产环境密码需复杂且定期更换# 连接超时时间(毫秒)timeout: 10000# Lettuce 连接池配置(需引入 commons-pool2 依赖)lettuce:pool:# 连接池最大活跃连接数(默认 8)max-active: 8# 连接池最大空闲连接数(默认 8)max-idle: 8# 连接池最小空闲连接数(默认 2)min-idle: 2# 连接池最大阻塞等待时间(默认 -1,即无限制)max-wait: 1000
关键配置说明
  • 若 Redis 未设置密码,需删除 password 配置,否则会因认证失败无法连接;

  • lettuce.pool 相关配置仅在引入 commons-pool2 依赖后生效,不配置则使用默认值;

  • 若使用远程 Redis 服务器(如阿里云),需确保服务器开放 6379 端口,且 Redis 允许外部 IP 访问(修改 Redis 配置文件 bind 0.0.0.0 并重启)。

3.2 自定义 RedisTemplate 配置(可选但推荐)

Spring Boot 自动注入的 RedisTemplate<String, Object> 存在一个问题:默认使用 JDK 序列化方式存储数据,导致在 Redis 客户端(如 redis-cli)中查看数据时显示为乱码。
为解决此问题,我们可以自定义 RedisTemplate,使用 JSON 序列化(如 Jackson)存储数据,步骤如下:
  1. 在 com.example.redisdemo 目录下创建 config 包,然后创建 RedisConfig 类;

  1. 编写配置代码,注入自定义的 RedisTemplate 和 StringRedisTemplate(专门处理 String 类型数据):

package com.example.redisdemo.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {/*** 自定义 RedisTemplate(处理 Object 类型数据)*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// 配置 Key 的序列化方式(String 序列化)StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);// 配置 Value 的序列化方式(JSON 序列化)GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);// 初始化 RedisTemplateredisTemplate.afterPropertiesSet();return redisTemplate;}/*** 专门处理 String 类型的 RedisTemplate(可选,Spring Boot 已自动注入)* 若需自定义,可参考上面的配置逻辑*/@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {return new StringRedisTemplate(redisConnectionFactory);}}
配置优势
  • Key 使用 StringRedisSerializer 序列化,确保在 Redis 客户端中显示为正常字符串;

  • Value 使用 GenericJackson2JsonRedisSerializer 序列化,支持 Java 对象与 JSON 的自动转换,且避免乱码;

  • StringRedisTemplate 是 RedisTemplate 的子类,专门用于处理 String 类型的 Key 和 Value,使用更便捷。

四、实战:编写 Redis 操作代码

完成配置后,我们通过 Service 层 + Controller 层 实现 Redis 的基本操作(增、删、改、查),并通过接口测试验证功能。

4.1 编写 Redis 服务层(Service)

在 com.example.redisdemo 目录下创建 service 包,然后创建 RedisService 接口和 RedisServiceImpl 实现类,封装 Redis 操作方法:

4.1.1 RedisService 接口

package com.example.redisdemo.service;public interface RedisService {/*** 存储数据(String 类型)* @param key 键* @param value 值* @param expireTime 过期时间(秒,0 表示永久有效)*/void setString(String key, String value, long expireTime);/*** 获取数据(String 类型)* @param key 键* @return 值(若不存在则返回 null)*/String getString(String key);/*** 存储对象(自动序列化为 JSON)* @param key 键* @param value 对象(如 User、Order 等)* @param expireTime 过期时间(秒)* @param <T> 对象类型*/<T> void setObject(String key, T value, long expireTime);/*** 获取对象(自动反序列化为指定类型)* @param key 键* @param clazz 对象类型* @param <T> 对象类型* @return 对象(若不存在则返回 null)*/<T> T getObject(String key, Class<T> clazz);/*** 删除数据* @param key 键* @return 是否删除成功(true:删除成功;false:键不存在)*/boolean delete(String key);}

4.1.2 RedisServiceImpl 实现类

package com.example.redisdemo.service.impl;import com.example.redisdemo.service.RedisService;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import javax.annotation.Resource;import java.util.concurrent.TimeUnit;@Servicepublic class RedisServiceImpl implements RedisService {// 注入自定义的 RedisTemplate@Resourceprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic void setString(String key, String value, long expireTime) {// 使用 opsForValue() 操作 String 类型数据redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);}@Overridepublic String getString(String key) {Object value = redisTemplate.opsForValue().get(key);return value != null ? value.toString() : null;}@Overridepublic <T> void setObject(String key, T value, long expireTime) {// 自动将对象序列化为 JSON 存储redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);}@Overridepublic <T> T getObject(String key, Class<T> clazz) {// 自动将 JSON 反序列化为指定类型对象Object value = redisTemplate.opsForValue().get(key);return value != null ? (T) value : null;}@Overridepublic boolean delete(String key) {return redisTemplate.delete(key);}}
核心 API 说明
  • redisTemplate.opsForValue():操作 String 类型数据(最常用);

  • redisTemplate.opsForHash():操作 Hash 类型数据(适合存储对象的多个字段);

  • redisTemplate.opsForList():操作 List 类型数据(适合实现队列、栈等);

  • set(...) 方法的 TimeUnit.SECONDS 表示过期时间单位为 “秒”,还支持 MINUTES(分钟)、HOURS(小时)等。

4.2 编写测试接口(Controller)

为了方便测试 Redis 功能,我们创建一个 Controller 类,提供 HTTP 接口:
package com.example.redisdemo.controller;import com.example.redisdemo.service.RedisService;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController@RequestMapping("/redis")public class RedisController {@Resourceprivate RedisService redisService;// 测试存储 String 类型@PostMapping("/string")public String setString(@RequestParam String key,@RequestParam String value,@RequestParam(defaultValue = "3600") long expireTime) {redisService.setString(key, value, expireTime);return "String 数据存储成功!key=" + key + ", value=" + value;}// 测试获取 String 类型@GetMapping("/string/{key}")public String getString(@PathVariable String key) {String value = redisService.getString(key);return "获取 String 数据:key=" + key + ", value=" + (value != null ? value : "null");}// 测试存储对象(以 User 为例)@PostMapping("/object")public String setObject(@RequestParam String key,@RequestParam String username,@RequestParam Integer age,@RequestParam(defaultValue = "3600") long expireTime) {// 创建 User 对象(实际项目中建议单独定义 User 实体类)User user = new User(username, age);redisService.setObject(key, user, expireTime);return "对象存储成功!key=" + key + ", user=" + user;}// 测试获取对象@GetMapping("/object/{key}")public User getObject(@PathVariable String key) {return redisService.getObject(key, User.class);}// 测试删除数据@DeleteMapping("/{key}")public String delete(@PathVariable String key) {boolean success = redisService.delete(key);return success ? "删除成功!key=" + key : "删除失败!key=" + key + " 不存在";}// 内部静态类:模拟 User 实体(实际项目中建议单独创建实体类)static class User {private String username;private Integer age;public User() {} // 必须有默认构造函数,否则 JSON 反序列化会失败public User(String username, Integer age) {this.username = username;this.age = age;}// Getter 和 Setter(必须,否则 JSON 序列化/反序列化无法获取/设置属性)public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public Integer getAge() { return age; }public void setAge(Integer age) { this.age = age; }@Overridepublic String toString() {return "User{username='" + username + "', age=" + age + "}";}}}

五、测试 Redis 功能

5.1 启动 Spring Boot 项目

找到项目的启动类 RedisDemoApplication(默认在 com.example.redisdemo 目录下),点击 IDEA 中的 运行按钮(绿色三角图标)即可启动项目。如果你的项目采用 Maven 构建,也可以在项目根目录下打开命令行窗口,执行 mvn spring-boot:run 命令进行启动;若使用 Gradle,则运行 ./gradlew bootRun 指令。
在启动过程中,注意观察控制台输出的日志信息。当出现 Started RedisDemoApplication in XX.XXX seconds (JVM running for XX.XXX) 类似字样时,表明 Spring Boot 项目已成功启动。若启动失败,需仔细排查日志中报错信息,常见问题包括端口冲突(可通过修改 application.yml 中的 server.port 配置项解决)、依赖冲突或配置文件语法错误等。

5.2 接口测试(Postman 或浏览器)

项目启动后,我们通过 Postman(推荐)或浏览器调用接口,验证 Redis 操作是否正常。以下是各接口的测试步骤和预期结果:

5.2.1 测试存储 String 类型数据

  • 请求方式:POST

  • 参数说明

    • key=testString:自定义键名

    • value=HelloRedis:存储的字符串值

    • expireTime=3600:过期时间 1 小时(默认值,可省略)

  • 预期响应:String 数据存储成功!key=testString, value=HelloRedis

5.2.2 测试获取 String 类型数据

  • 请求方式:GET

  • 预期响应:获取 String 数据:key=testString, value=HelloRedis

5.2.3 测试存储 Object 类型数据

  • 请求方式:POST

  • 参数说明

    • key=testUser:键名

    • username=ZhangSan、age=25:User 对象的属性

  • 预期响应:对象存储成功!key=testUser, user=User{username='ZhangSan', age=25}

5.2.4 测试获取 Object 类型数据

  • 请求方式:GET

  • 预期响应:JSON 格式的 User 对象

{"username": "ZhangSan","age": 25}

5.2.5 测试删除数据

  • 请求方式:DELETE

  • 预期响应:删除成功!key=testString

  • 验证:再次调用 “获取 String 数据” 接口,响应应为 获取 String 数据:key=testString, value=null

5.3 通过 Redis 客户端验证数据(可选)

为确保数据确实存储到 Redis 中,可通过 redis-cli 客户端查看数据:
  1. 打开 CMD 窗口,进入 Redis 解压目录,执行 redis-cli.exe -h 127.0.0.1 -p 6379 连接 Redis;

  1. 若 Redis 配置了密码,需先执行 auth 123456(替换为你的密码)进行认证;

  1. 执行以下命令查看数据:

# 查看所有键(验证键是否存在)keys *# 获取 String 类型数据(若未删除 testString)get testString# 获取 Object 类型数据(testUser 存储的是 JSON 字符串)get testUser
  • 预期结果

    • get testString 返回 HelloRedis(未删除时);

    • get testUser 返回 {"username":"ZhangSan","age":25},证明 JSON 序列化生效,无乱码。

六、常见问题与解决方案

在配置过程中,新手容易遇到以下问题,这里提供针对性的解决方法:

6.1 连接 Redis 失败(Could not connect to Redis server)

可能原因:

  1. Redis 服务器未启动;

  1. Redis 配置的 host 或 port 错误;

  1. 远程 Redis 服务器未开放 6379 端口;

  1. Redis 配置了密码,但项目中未配置 spring.redis.password(或密码错误)。

解决方案:

  1. 本地 Redis:执行 redis-server.exe redis.windows.conf 启动服务;

  1. 检查 application.yml 中 spring.redis.host 和 spring.port 是否与 Redis 服务器一致;

  1. 远程 Redis(如阿里云):

    • 在服务器安全组中开放 6379 端口;

    • 修改 Redis 配置文件 redis.conf,将 bind 127.0.0.1 改为 bind 0.0.0.0(允许外部 IP 访问),重启 Redis;

  1. 确认 spring.redis.password 与 Redis 服务器密码一致,若未设置密码则删除该配置。

6.2 数据反序列化失败(Could not read JSON document)

可能原因:

  1. 实体类(如 User)缺少 默认无参构造函数

  1. 实体类的属性缺少 Getter/Setter 方法

  1. 自定义 RedisTemplate 时,Value 序列化方式配置错误。

解决方案:

  1. 为实体类添加默认无参构造函数(即使手动写了有参构造,也需显式定义无参构造);

  1. 确保实体类的所有属性都有 Getter/Setter 方法(JSON 序列化需通过反射获取 / 设置属性值);

  1. 检查 RedisConfig 中 Value 序列化配置,确保使用 GenericJackson2JsonRedisSerializer:

redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

6.3 Redis 客户端查看数据乱码

可能原因:

使用了 Spring Boot 自动注入的 RedisTemplate,默认采用 JDK 序列化方式存储 Value。

解决方案:

按照本文 3.2 节 配置自定义 RedisTemplate,将 Key 用 StringRedisSerializer、Value 用 GenericJackson2JsonRedisSerializer 序列化,即可解决乱码问题。

七、总结与进阶方向

7.1 本文核心要点回顾

  1. 环境准备:确保 JDK、Spring Boot、Redis 版本兼容,本地 Redis 启动后通过 ping 验证;

  1. 依赖配置:引入 spring-boot-starter-data-redis 和 commons-pool2(连接池),简化客户端集成;

  1. 核心配置:通过 application.yml 配置 Redis 服务器信息和连接池参数,自定义 RedisTemplate 解决序列化问题;

  1. 功能实现:通过 RedisTemplate 封装 String 和 Object 类型的增删改查,结合 Controller 接口测试;

  1. 问题排查:针对连接失败、序列化异常、数据乱码等常见问题,掌握关键解决思路。

7.2 进阶学习方向

掌握基础配置后,可进一步学习 Redis 在实际开发中的进阶用法:
  1. Redis 数据结构深化:学习 Hash(存储对象字段)、List(实现消息队列)、Set(去重)、ZSet(排序)的用法,通过 redisTemplate.opsForHash()、opsForList() 等 API 实现;

  1. 缓存策略优化

    • 配置缓存过期时间避免数据过期;

    • 实现缓存穿透(空值缓存)、缓存击穿(互斥锁)、缓存雪崩(过期时间加随机值)的解决方案;

  1. 分布式锁:基于 Redis 实现分布式锁(如 setIfAbsent 方法),解决多服务并发问题;

  1. Redis 集群:学习 Redis 主从复制、哨兵模式、Cluster 集群配置,应对高可用和高并发场景;

  1. Spring Cache 整合:使用 @Cacheable、@CachePut、@CacheEvict 注解简化缓存操作,减少重复代码。

通过本文的步骤,你已经掌握了 Spring Boot 整合 Redis 的核心流程。建议在此基础上动手实践,尝试用 Redis 实现一个简单的缓存功能(如缓存用户信息),并逐步探索进阶用法,让 Redis 真正服务于实际项目开发。


分享给朋友:

“Spring Boot 配置 Redis 入门指南:从环境搭建到实战操作” 的相关文章

Linux常用命令大全

Linux常用命令大全

Linux是开发与运维工作中不可或缺的工具,掌握常用命令能显著提升效率。本篇整理了一些高频使用的命令,覆盖文件操作、系统监控、网络调试等核心场景,适合入门学习或作为日常参考使用。以下是一些常用的Linux命令:1. ls:列出当前目录中的文件和子目录ls2. pwd:显示当前工作目录的路径pwd3....

Spring Boot 实现 MySQL 数据多选删除功能详解

在实际的 Web 开发中,数据删除是常见操作,而多选删除能极大提升用户操作效率,比如批量删除商品、订单、用户信息等场景。本文将基于 Spring Boot 框架,结合 MySQL 数据库,从需求分析到代码实现,完整讲解多选删除功能的开发过程,包含前端页面交互、后端接口设计、数据库操作及异常处理,适合...

Spring Boot 过滤器入门:从概念到实战配置

在 Web 开发中,过滤器(Filter)是处理 HTTP 请求和响应的重要组件,它能在请求到达控制器前、响应返回客户端前进行拦截和处理。比如日志记录、权限验证、字符编码转换等场景,都离不开过滤器的身影。本文将带大家从零开始,掌握 Spring Boot 中过滤器的入门知识和完整设置流程。一、过滤器...