我這裡是通過 docker-compose 來安裝的,目錄結構如下,你可以在一個目錄下定義 data 、logs 目錄。
然後建立 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
複制代碼
其他指令
docker stats redis-6379
複制代碼
然後檢視是否執行成功,檢視docker 容器
docker ps
複制代碼
檢視redis 的記憶體與CPU
docker stats redis-6379
複制代碼
關閉 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 ;
}
}
複制代碼
儲存使用者對象資訊
@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 調用 儲存使用者的接口
然後使用 RDM 用戶端檢視 redis 庫
然後過 10 秒後重新整理一下,使用者緩存資料已清除
@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;
}
}