SpringBoot项目集成Redis缓存

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);
    }

源码地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值