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-value |
get (key) | 获取某一个key的value |
keys * | 查询所有key |
del (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);
}