以首页的文件访问作为示例使用Redis
一方面加快用户访问速度
一方面缓解频繁访问数据库的压力
之前每次访问首页都会请求数据库数据
Redis安装以及配置
所需文件
解压后,双击下述脚本,启动redis
可视化软件安装、设置安装路径然后一直点下一步就OK
采用软件连接本地Redis【默认端口6379】
后台代码
采用Cache实现缓存
pom.xml
添加Cache缓存的依赖
<!-- cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
SpringBootApplication.java
添加注解@EnableCaching开启缓存
EchartsController.java
给文件访问的接口添加缓存
@AuthAccess
@GetMapping("/file/front/all")
@Cacheable(value = "files" ,key = "'frontAll'")
public Result frontAll() {
return Result.success(fileMapper.selectList(null));
}
FileController.java
采用Cache实现更新与删除同步【注意要return数据】
实现在后台更新数据后,Cache自动更新/删除,重新设置缓存
@PostMapping("/update")
@CachePut(value = "files" ,key = "'frontAll'")
public Result update(@RequestBody Files files) {
fileMapper.updateById(files);
return Result.success(fileMapper.selectList(null));
}
@DeleteMapping("/{id}")
清除一条缓存,key为要清空的数据
@CacheEvict(value="files",key="'frontAll'")
public Result delete(@PathVariable Integer id) {
Files files = fileMapper.selectById(id);
files.setIsDelete(true);
fileMapper.updateById(files);
return Result.success();
}
采用Redis实现缓存
pom.xml
添加 Redis的依赖
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml
添加redis配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/joyce?serverTimezone=GMT%2b8
username: root
password: 123456
redis:
host: 127.0.0.1
port: 6379
SpringBootApplication.java
注释掉注解@EnableCaching、顺便把之前FileController的Cache涉及注解也注释掉
Constants.java
定义文件的key【因为Redis数据为键值对(key,value),需要靠key来存取数据】
package com.zj.demo.common;
public interface Constants {
String CODE_200 = "200"; //成功
String CODE_401 = "401"; // 权限不足
String CODE_400 = "400"; // 参数错误
String CODE_500 = "500"; // 系统错误
String CODE_600 = "600"; // 其他业务异常
String DICT_TYPE_ICON= "icon";
String FILES_KEY = "FILES_FRONT_ALL";
}
EchartsController.java
给文件访问的接口请求的数据缓存到Redis
//操作Json类型数据用字符串RedisTemplate
private StringRedisTemplate stringRedisTemplate;
==================================================
@AuthAccess
@AuthAccess
@GetMapping("/file/front/all")
// @Cacheable(value = "files" ,key = "'frontAll'")
public Result frontAll() {
// 1. 从缓存获取数据
String jsonStr = stringRedisTemplate.opsForValue().get(Constants.FILES_KEY);
List<Files> files;
if (StrUtil.isBlank(jsonStr)) { // 2. 取出来的json是空的
files = fileMapper.selectList(null); // 3. 从数据库取出数据
// 4. 再去缓存到redis
stringRedisTemplate.opsForValue().set(Constants.FILES_KEY, JSONUtil.toJsonStr(files));
} else {
// 减轻数据库的压力
// 5. 如果有, 从redis缓存中获取数据
files = JSONUtil.toBean(jsonStr, new TypeReference<List<Files>>() {
}, true);
}
return Result.success(files);
}
FileController.java
采用Cache实现更新与删除同步【注意要return数据】
实现在后台更新数据后,Redis自动更新/删除,重新设置缓存
@Autowired
private StringRedisTemplate stringRedisTemplate;
===============================================
// @CachePut(value = "files", key = "'frontAll'")
@PostMapping("/update")
public Result update(@RequestBody Files files) {
fileMapper.updateById(files);
flushRedis(Constants.FILES_KEY);
return Result.success();
}
//清除一条缓存,key为要清空的数据
// @CacheEvict(value="files",key="'frontAll'")
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
Files files = fileMapper.selectById(id);
files.setIsDelete(true);
fileMapper.updateById(files);
flushRedis(Constants.FILES_KEY);
return Result.success();
}
// 设置缓存
private void setCache(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
// 删除缓存
private void flushRedis(String key) {
stringRedisTemplate.delete(key);
}
页面测试
Cache实现缓存
开启Cache之后后台访问情况
登录后第一次访问会到数据库查询,再次刷新之后就会从缓存里取,不会再次访问数据库
Cache更新操作@CachePut
采用@CachePut注解,后台更新文件数据,cache会重新访问数据库进行更新操作
Cache删除操作@CacheEvict
采用@CachePut注解,后台更新文件数据,cache会重新访问数据库进行更新操作
Redis实现缓存
采用Redis缓存首页文件数据
首次访问首页,会到数据库里查询数据,然后以键值对形式储存到Redis中
刷新首页,就不会再去数据库查了,而是从Redis获取
Redis实现缓存更新
后台上传新的文件,update接口会删除Redis缓存,再次访问首页时frontAll接口会重新向数据库请求数据,并将更新数据存入Redis
Redis实现缓存删除
后台上传新的文件,delete接口会删除Redis缓存,再次访问首页时frontAll接口会重新向数据库请求数据,并将更新数据存入Redis
补充
Redis
特点
- 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- 支持事务
优势:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
- 丰富的特性 – Redis还支持publish/subscribe, 通知, key 过期等等特性。
其他详细内容点击这里可见
SpringBoot Cache整合与使用
https://blog.csdn.net/qq_32448349/article/details/101696892
https://www.cnblogs.com/ejiyuan/p/11014765.html