天天看點

SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

作者:面試指導

我這裡是通過 docker-compose 來安裝的,目錄結構如下,你可以在一個目錄下定義 data 、logs 目錄。

SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

然後建立 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系列8

其他指令

docker stats redis-6379
複制代碼           

然後檢視是否執行成功,檢視docker 容器

docker ps 
複制代碼           
SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

檢視redis 的記憶體與CPU

docker stats redis-6379
複制代碼           
SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

關閉 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系列8

儲存使用者對象資訊

@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系列8

然後使用 RDM 用戶端檢視 redis 庫

SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

然後過 10 秒後重新整理一下,使用者緩存資料已清除

SpringBoot 內建Redis緩存 以及實作基本的資料緩存SpringBoot系列8

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

繼續閱讀