SpringBoot项目集成Redis缓存

it2025-03-25  4

1.作用

在经常进行读写操作时,可使用redis对数据进行缓存,减少对数据库的读写操作。

2.安装

链接 提取码:paj3

2.1测试安装

2.1.1运行

(1)在安装目录下打开cmd窗口

小技巧:点击文件路径(上图红圈),输入cmd直接在该目录下打开命令窗口.

(2)输入命令:redis-server.exe redis.windows.conf启动服务.

或者通过双击redis-server.exe启动服务

(3)另外打开一个 cmd 窗口,原来的不要关闭,不然就关闭访问服务端了。输入命令:redis-cli.exe 如果redis没有启动就执行该命令会报错"由于目标计算机积极拒绝,无法连接",此时先通过(2)启动服务. 常用命令有

命令作用set (key) (value)设置key-valueget (key)获取某一个key的valuekeys *查询所有keydel (key)删除某个key

3.使用

3.1创建项目

创建一个spring boot项目

3.2引入依赖

在pom.xml中引入依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

3.3手动使用

3.3.1使用方法

(1)创建RedisTemplate实例。 (2)通过opsForValue().set设置键 (3)通过opsForValue().get("key")获取值

3.3.2测试用例

package com.example.redisdemo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; @SpringBootTest class RedisdemoApplicationTests { @Autowired private RedisTemplate<String, String> redisTemplate; @Test void testGetCache() { // 添加redis缓存 redisTemplate.opsForValue().set("testRedis", "hello redis!"); } @Test void testSetCache() { // 读取redis缓存 String testRedis = redisTemplate.opsForValue().get("testRedis"); System.out.println(testRedis); } }

3.3.1添加缓存

3.3.2读取缓存

3.3缓存数据库的数据

3.3.1添加注解

(1)在类上添加@EnableCaching(测试,无论是controller还是启动类上添加该注解都行,原因待研究。) (2)在方法上添加@Cacheable(“userList”)注解,这里的userList是缓存的名字。

如果不设置key,则默认key为"SimpleKey []"。 如果通过key = “参数值”设置了key,则表明有一个缓存名为“XXX”,里面有很多key-value对,它的key就是设置的“key”。如下面代码,有一个名为“user”的缓存,里面存有<id,user>的键值对。 @RestController @RequestMapping("redis") @EnableCaching public class RedisController { @Autowired private RedisService redisService; /** * 设置了一个名为"userList"的缓存 */ @GetMapping() @Cacheable(cacheNames ="userList") public List<User> getUser(){ System.out.println("通过有没有输出,若没有输出,代表执行了缓存,从redis中获取了数据"); return redisService.getUser(); } /** * 设置了一个名为"user"的缓存,同时传入的"id"设为key */ @GetMapping("/{id}") @Cacheable(cacheNames ="User",key = "#id") public User getUserById(@PathVariable Long id){ System.out.println("通过有没有输出,若没有输出,代表执行了缓存,从redis中获取了数据"); return redisService.getUserById(id); } }

经过多次查询后的redis如下:

3.3.2执行过程

当web发送请求到有@Cacheable注解的方法时,会先从redis缓存中,查询对应的key存不存在,若存在,则直接从缓存中获取value作为返回值返回;若不存在,则再执行方法。

3.3.3测试

通过postman模拟请求,第一次会打印上文的输出,且在控制台有sql语句执行。第二次没有输出,也没有sql语句执行,则表明第二次是从redis中获取的数据,而没有再执行getUser()方法。

问题:redis如何知道数据库的数据有没有更新,可以试试当手动修改数据库的值时,在调用刚刚的接口,看看返回的数据有没有改变

3.3.4更新缓存

在命令行中,更新key对应的值从新set就行,和map结构一样,若key已经存在,则覆盖之前的value。在项目中,如果要更新redis中的值。在对应方法上添加@CachePut注解并且将要更新的value作为返回就行,redis,会找到对应的key通过set覆盖之前的value。,它的参数和之前用的@Cacheable一样,唯一不同在于,@Cacheable会在执行方法前去找redis是否存在相应的key,如果存在,则不执行方法体;而@CachePut无论怎样都会执行方法体。 @PostMapping() @CachePut(cacheNames ="User",key = "#user.id") public User saveUser(User user){ return redisService.saveUser(user); }

源码地址

最新回复(0)