1 项目准备

创建SpringBoot基础项目SpringBoot项目集成mybatisSpringBoot 集成 Druid 数据源【SpringBoot系列3】SpringBoot MyBatis 实现分页查询数据【SpringBoot系列4】SpringBoot MyBatis-Plus 集成 【SpringBoot系列5】SpringBoot mybatis-plus-generator 代码生成器 【SpringBoot系列6】SpringBoot MyBatis-Plus 分页查询 【SpringBoot系列7】

使用 Redis ,首先要安装,可以参考这里 https://www.runoob.com/redis/redis-install.html 我这里是通过 docker-compose 来安装的,目录结构如下,你可以在一个目录下定义 data 、logs 目录 。

springboot 保证redis计数准确 springboot配置redis持久化_redis

然后创建 redis.conf 文件

#开启远程可连接
#bind 127.0.0.1
#自定义密码
requirepass 12345678
#指定 Redis 监听端口(默认:6379)
port 6379
#客户端闲置指定时长后关闭连接(单位:秒。0:关闭该功能)
timeout 0
# 900s内如果至少一次写操作则执行bgsave进行RDB持久化操作
save 900 1
# 在300s内,如果至少有10个key进行了修改,则进行持久化操作
save 300 10
#在60s内,如果至少有10000个key进行了修改,则进行持久化操作
save 60 10000
#是否压缩数据存储(默认:yes。Redis采用LZ 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大)
rdbcompression yes
#指定本地数据文件名(默认:dump.rdb)
dbfilename dump.rdb
#指定本地数据文件存放目录
dir /data
#指定日志文件位置(如果是相对路径,redis会将日志存放到指定的dir目录下)
logfile "redis.log"

然后编写
docker-compose.yml

version: "3.2"

services:
  redis:
    image: redis:6.2.6
    container_name: redis-6379
    restart: always
    volumes:
      - ./redis.conf:/etc/redis/redis.conf:ro
      - ./data:/data
      - ./logs:/logs
    command: redis-server /etc/redis/redis.conf
    ports:
      - "6378:6379"

然后在当前目录下打开终端,执行命令

docker-compose up -d

springboot 保证redis计数准确 springboot配置redis持久化_spring_02


其他命令

docker stats redis-6379

然后查看是否执行成功,查看docker 容器

docker ps

springboot 保证redis计数准确 springboot配置redis持久化_缓存_03

查看redis 的内存与CPU

docker stats redis-6379

springboot 保证redis计数准确 springboot配置redis持久化_spring_04


关闭 redis

docker stop redis-6379
2 SpringBoot 中集成 Redis

pom.xml 中添加依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <version>2.7.9</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
  <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>2.11.1</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.11</version>
  </dependency>

Spring Boot框架中已经集成了redis,在1.x.x的版本中默认使用jedis客户端,而在2.x.x版本中默认使用的lettuce客户端。
本项目使用的 SpringBoot 2.7.9 版本 ,所以采用lettuce来进行配置。

在 application.yml 中添加Redis配置信息:

spring:
  redis:
    database: 0  # Redis数据库索引(默认为0)
    host: localhost # Redis服务器地址
    port: 6379  # Redis服务器连接端口
    password:   # Redis服务器连接密码(默认为空)
    lettuce:
      pool:
       max-active: 8  # 连接池最大连接数(使用负值表示没有限制) 默认 8
       max-wait: -1   # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
       max-idle: 8    # 连接池中的最大空闲连接 默认 8
       min-idle: 0    # 连接池中的最小空闲连接 默认 0

添加一个Redis配置类,使用@EnableCaching注解来开启缓存

import java.lang.reflect.Method;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{

    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

然后创建一个 RedisController 来测试

import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags="Redis 测试使用")
@RestController()
@RequestMapping("/redis")
@Slf4j
public class RedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/testString")
    public String testString()  {
        log.info("redis 开始保存值  ");
        stringRedisTemplate.opsForValue().set("name", "早起的年轻人");
        log.info("redis 保存完成  ");
        String name = stringRedisTemplate.opsForValue().get("name");
        return "redis 中取出的值是  " + name ;
    }
}

springboot 保证redis计数准确 springboot配置redis持久化_redis_05

保存用户对象信息

@Api(tags="Redis 测试使用")
@RestController()
@RequestMapping("/redis")
@Slf4j
public class RedisController {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/getUser")
    public String testGetUser()  {
        ValueOperations<String, UserInfo> operations = redisTemplate.opsForValue();
        UserInfo userInfo = operations.get("sys.user");
        if(userInfo==null){
            return "未查询到用户";
        }
        return userInfo.toString();
    }
    @GetMapping("/saveUser")
    public String testSaveUser()  {

        UserInfo user = new UserInfo();
        user.setUserName("早起的年轻人");
        user.setUserAge(30);

        ValueOperations<String, UserInfo> operations = redisTemplate.opsForValue();

        //保存数据
        operations.set("sys.user", user);
        // 设置10秒后过期
        operations.set("sys.user", user, 10, TimeUnit.SECONDS);


        return "保存用户信息成功";
    }
}

postman 调用 保存用户的接口

springboot 保证redis计数准确 springboot配置redis持久化_spring_06


然后使用 RDM 客户端查看 redis 库

springboot 保证redis计数准确 springboot配置redis持久化_Redis_07


然后过 10 秒后刷新一下,用户缓存数据已清除

springboot 保证redis计数准确 springboot配置redis持久化_spring_08


@Cacheable注解缓存,先查询缓存,有就直接返回,无就执行方法查询,然后将查询结果返回并保存到缓存中

import org.springframework.cache.annotation.Cacheable;

@Api(tags="Redis 测试使用")
@RestController()
@RequestMapping("/redis")
@Slf4j
public class RedisController {
  
    @GetMapping("/getUser")
    @Cacheable(value="user-key")
    public UserInfo getUser() {
        
        log.info("执行数据库查询用户");
        UserInfo user = new UserInfo();
        user.setUserName("早起的年轻人");
        user.setUserAge(30);
        
        return user;
    }
}