目标:把用户列表接口加上 redis 缓存。第一次访问查 mysql,同时把数据存入 redis;后续访问直接读取 redis,减轻数据库压力。
前置:redis 服务已经启动(你之前部署好的 redis)
pom.xml 引入 redis 依赖
打开 pom.xml,在<dependencies>标签内添加:
<!-- springboot redis 启动器 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>添加完成后,右侧 maven 面板点🔄刷新,等待依赖下载,无红色报错继续。
application.yml 添加 redis 配置
在 yml 的spring节点下面追加 redis 配置:
# 数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.driver
url: jdbc:mysql://localhost:3306/testdb?useunicode=true&characterencoding=utf8&servertimezone=asia/shanghai
username: root # 改成你的mysql账号
password: ac_191120 # 改成你的mysql密码
# redis 新配置写法
data:
redis:
host: 127.0.0.1
port: 6379
password: # redis有密码就填,没有保持空
database: 0 # 使用第0号库创建 redis 配置类,序列化处理(重点!解决中文乱码)
新建包 com.zzs.szyt.config,新建 redisconfig.java
package com.zzs.szyt.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.serializer.genericjackson2jsonredisserializer;
import org.springframework.data.redis.serializer.stringredisserializer;
@configuration
public class redisconfig {
@bean
public redistemplate<string, object> redistemplate(redisconnectionfactory factory) {
redistemplate<string, object> redistemplate = new redistemplate<>();
redistemplate.setconnectionfactory(factory);
// key序列化
redistemplate.setkeyserializer(new stringredisserializer());
// value序列化,使用json
redistemplate.setvalueserializer(new genericjackson2jsonredisserializer());
redistemplate.afterpropertiesset();
return redistemplate;
}
}作用:默认 redistemplate 使用 jdk 序列化,存进去是乱码二进制;这个配置改成 json 序列化,方便我们在 redis 客户端查看数据。
修改 usercontroller,增加缓存逻辑
改造 /user/list 查询接口,增加 redis 读写逻辑:
package com.zzs.szyt.controller;
import com.zzs.szyt.entity.user;
import com.zzs.szyt.mapper.usermapper;
import jakarta.annotation.resource;
import org.springframework.data.redis.core.redistemplate;
import org.springframework.data.redis.core.valueoperations;
import org.springframework.web.bind.annotation.*;
import java.util.list;
import java.util.concurrent.timeunit;
@restcontroller
@requestmapping("/user")
public class usercontroller {
@resource
private usermapper usermapper;
@resource
private redistemplate<string,object> redistemplate;
@getmapping("/list")
public list<user> getuserlist(){
valueoperations<string, object> ops = redistemplate.opsforvalue();
string cachekey = "user:list";
//1. 先去redis查询缓存
list<user> userlist = (list<user>) ops.get(cachekey);
if(userlist != null){
system.out.println("====从redis读取缓存数据====");
return userlist;
}
//2. redis没有数据,查询mysql
system.out.println("====查询mysql数据库====");
userlist = usermapper.selectalluser();
//3. 将查询结果存入redis,设置过期时间 30秒
ops.set(cachekey, userlist,30, timeunit.seconds);
return userlist;
}
// ========== 下面add/update/delete接口保持不变 ==========
@postmapping("/add")
public string adduser(@requestbody user user){
int rows = usermapper.insertuser(user);
if(rows > 0){
//新增数据后,清空缓存,保证下一次查询拿到最新数据
redistemplate.delete("user:list");
return "新增成功";
}else{
return "新增失败";
}
}
@putmapping("/update")
public string updateuser(@requestbody user user){
int rows = usermapper.updateuser(user);
if(rows > 0){
//修改后清空缓存
redistemplate.delete("user:list");
return "修改成功";
}else{
return "修改失败";
}
}
@deletemapping("/delete/{id}")
public string deleteuser(@pathvariable integer id){
int rows = usermapper.deleteuserbyid(id);
if(rows > 0){
//删除后清空缓存
redistemplate.delete("user:list");
return "删除成功";
}else{
return "删除失败";
}
}
}缓存逻辑说明:
- 查询:优先读 redis,没有才查 mysql,写入 redis,30 秒过期
- 新增 / 修改 / 删除:操作数据库成功后删除缓存 key,下次查询自动重新加载最新数据,防止缓存和数据库不一致
测试步骤
- 确认本地 redis 已经启动
- 重启 springboot 项目
- 浏览器访问
http://localhost:8080/user/list- 第一次访问:控制台打印
====查询mysql数据库====,数据存入 redis - 30 秒内再次访问:控制台打印
====从redis读取缓存数据====,不走数据库
- 第一次访问:控制台打印
- 新增 / 修改 / 删除用户,再访问列表,缓存自动刷新
✅ 本章校验清单
- 项目启动无报错,可以正常访问 /user/list
- 观察控制台打印,验证缓存是否生效
- 新增 / 修改 / 删除用户后,列表拿到最新数据
到此这篇关于springboot整合redis7实现接口缓存的完整方案(最新)的文章就介绍到这了,更多相关springboot 整合 redis缓存内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论