文章目錄
- Redis快取
- 主要步驟
- 具體實踐
- 整體目錄結構
- pom.xml添加依賴
- yml檔案里配置Redis集群
- 撰寫RedisConfig配置序列化及快取配置,添加快取注解
- 撰寫業務Controller
- 撰寫啟動類
- 檢驗結果
之前不是說過Redis可以當作快取用嘛
現在我們就配置一下SpringBoot使用Redis的快取
Redis快取
為什么用Redis作快取
用redis做快取,是因為redis有著很優秀的讀寫能力,在集群下可以保證資料的高可用
主要步驟
- 1、pom.xml檔案添加依賴
- 2、yml檔案配置redis集群
- 3、撰寫RedisConfig配置序列化及快取配置,添加快取注解
- 4、撰寫業務Controller,添加快取注解
- 5、撰寫啟動類
具體實踐
整體目錄結構

pom.xml添加依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SpringBoot_Redis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--整合redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring boot test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>

yml檔案里配置Redis集群
結構是ip+port
spring:
redis:
cluster:
nodes:
- 169.254.0.100:8001
- 169.254.0.100:8002
- 169.254.0.100:8003
- 169.254.0.100:8004
- 169.254.0.100:8005
- 169.254.0.100:8006

撰寫RedisConfig配置序列化及快取配置,添加快取注解

設定序列化的Bean

設定快取的Bean

這里有必要解釋一下
- cacheNames.add() 這里我理解的是和controller進行系結,畢竟很多controller的時候,這里可以確定到底那個controller開啟快取,以及每個controller對快取的要求可能也不一樣
- configMap這里就是將我們對快取的一些配置和命名空間進行關聯
- 設定快取時間和禁止快取空資料應該還好理解
撰寫業務Controller
@RestController
@RequestMapping("user")
public class RedisCacheController {
@Cacheable(value = "user",key = "#root.methodName+#root.args[0]")
@GetMapping("findWord/{id}")
public String findWord(@PathVariable String id) {
System.out.println("Cacheing");
HashMap<String, String> words = new HashMap<>();
words.put("1", "java");
words.put("2", "redis");
words.put("3", "cache");
return words.get(id);
}
}
@Cacheable一定要加在方法之上
value就是之前在RedisConfig中定義的命名空間,也是快取保存的空間
key就是快取保存的key,這里以方法名為key,但是為避免方法名重復導致的key重復,所以加入id,來避免重復
關于快取的其他注解
- @CachePut
在支持Spring Cache的環境中,對于使用@Cacheale標注的方法,Spring在每次執行前都會檢查Cache中是否存在相同的key的快取元素,如果存在就不再執行該方法,而是從快取中獲取結果直接進行回傳,若不存在才會執行方法并將回傳結果存入指定的快取中
@Cacheput也可以生命一個方法支持快取功能,與@Cacheable不同的是使用@CachePut標注的方法在執行并不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,并將執行結果以鍵值對的形式存入快取中, - @CacheEvict
CacheEvict是用來標注在需要清除快取元素的方法或類上的,
當標記在一個類上時表示其中所有的方法的執行都會觸發快取的清除操作
@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation,
其中value、key和condition的語意與@Cacheable對應的屬性類似,即value表示清除操作是發生在哪些快取(命名空間)上的
key表示要清除的是哪個key,如未指定則會誰用默認策略生成的key,condition表示清除操作發生的條件
allEntries屬性
allEntries是boolean型別的,表示是否要清除快取中的所有元素,默認為false,當指定為true時,會忽略指定的key
beforeInvocation屬性
清除操作默認時在對應方法成功執行后觸發的,即方法如果因為拋出例外而未能成功回傳也不會觸發清除操作
使用beforeInvocation可以改變觸發清除操作的時間,當我們指定屬性值為true時,Spring會在呼叫該方法之前清除快取中的指定元素
撰寫啟動類
就是傳統的啟動類

檢驗結果
使用postman發送請求進行檢測
第一次的時候可以看到控制臺列印

這說明方法執行了
但是第二次發送相同請求的時候,可以看到拿到了資料,但是方法沒有執行,說明快取有用了


好了,到此結束,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294465.html
標籤:java
