整合Redis緩存實現

5.2 整合Redis緩存實現

5.2.1

Spring Boot支持的緩存組件java

在Spring Boot中,數據的緩存管理存儲依賴於Spring框架中cache相關的org.springframework.cache.Cache和org.springframework.cache.CacheManager緩存管理器接口。redis

若是程序中沒有定義類型爲CacheManager的Bean組件或者是名爲cacheResolver的CacheResolver緩存解析器,Spring Boot將嘗試選擇並啓用如下緩存組件(按照指定的順序):spring

(1)Generic數據庫

(2)JCache (JSR-107)
(EhCache 三、Hazelcast、Infinispan等)瀏覽器

(3)EhCache 2.x緩存

(4)Hazelcast服務器

(5)Infinispan框架

(6)Couchbaseless

(7)Redisspring-boot

(8)Caffeine

(9)Simple

上面按照Spring Boot緩存組件的加載順序,列舉了支持的9種緩存組件,在項目中添加某個緩存管理組件(例如Redis)後,Spring Boot項目會選擇並啓用對應的緩存管理器。若是項目中同時添加了多個緩存組件,且沒有指定緩存管理器或者緩存解析器(CacheManager或者cacheResolver),那麼Spring Boot會按照上述順序在添加的多個緩存中優先啓用指定的緩存組件進行緩存管理。


剛剛講解的Spring Boot默認緩存管理中,沒有添加任何緩存管理組件能實現緩存管理。這是由於開啓緩存管理後,Spring Boot會按照上述列表順序查找有效的緩存組件進行緩存管理,若是沒有任何緩存組件,會默認使用最後一個Simple緩存組件進行管理。Simple緩存組件是Spring Boot默認的緩存管理組件,它默認使用內存中的ConcurrentMap進行緩存存儲,因此在沒有添加任何第三方緩存組件的狀況下,能夠實現內存中的緩存管理,可是咱們不推薦使用這種緩存管理方式

5.2.2 基於註解的Redis緩存實現


在Spring Boot默認緩存管理的基礎上引入Redis緩存組件,使用基於註解的方式講解Spring Boot整合Redis緩存的具體實現

(1)添加Spring Data Redis依賴啓動器。在pom.xml文件中添加Spring Data Redis依賴啓動器

<dependency>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

當咱們添加進redis相關的啓動器以後,
SpringBoot會使用RedisCacheConfigratioin當作生效的自動配置類進行緩存相關的自動裝配,容器中使用的緩存管理器是

RedisCacheManager, 這個緩存管理器建立的Cache爲 RedisCache, 進而操控redis進行數據的緩存

(2)Redis服務鏈接配置

# Redis服務地址

spring.redis.host=127.0.0.1

# Redis服務器鏈接端口

spring.redis.port=6379

# Redis服務器鏈接密碼(默認爲空)

spring.redis.password=

(3)對CommentService類中的方法進行修改使用@Cacheable、@CachePut、@CacheEvict三個註解定製緩存管理,分別進行緩存存儲、緩存更新和緩存刪除的演示

@Service

public class CommentService {

 

   
@Autowired

   
private CommentRepository commentRepository;

 

   
@Cacheable(cacheNames = "comment",unless =
"#result==null")

   
public Comment findCommentById(Integer id){

       
Optional<Comment> comment = commentRepository.findById(id);

       
if(comment.isPresent()){

           
Comment comment1 = comment.get();

           
return comment1;

       
}

       
return null;

    }

 

   
@CachePut(cacheNames = "comment",key = "#result.id")

   
public Comment updateComment(Comment comment) {

      
commentRepository.updateComment(comment.getAuthor(), comment.getaId());

       
return comment;

    }

 

   
@CacheEvict(cacheNames = "comment")

   
public void deleteComment(int comment_id) {

       
commentRepository.deleteById(comment_id);

    }

 

}

以上
使用@Cacheable、@CachePut、@CacheEvict註解在數據查詢、更新和刪除方法上進行了緩存管理。

其中,查詢緩存@Cacheable註解中沒有標記key值,將會使用默認參數值comment_id做爲key進行數據保存,在進行緩存更新時必須使用一樣的key;同時在查詢緩存@Cacheable註解中,定義了「unless = "#result==null"」表示查詢結果爲空不進行緩存

(4) 基於註解的Redis查詢緩存測試

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JRaSokHu-1591686825003)(./images/image-20191231141712756.png)]


能夠看出,查詢用戶評論信息Comment時執行了相應的SQL語句,可是在進行緩存存儲時出現了IllegalArgumentException非法參數異常,提示信息要求對應Comment實體類必須實現序列化(「DefaultSerializer
requires a Serializable payload but received an object of type」)。

(5)將緩存對象實現序列化。

<img
src="./images/image-20191231141845520.png"
alt="image-20191231141845520" style="zoom:67%;" />

(6)再次啓動測試


訪問「http://localhost:8080/findCommentById?id=1」查詢id爲1的用戶評論信息,並重復刷新瀏覽器查詢同一條數據信息,查詢結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Z61ZkNb2-1591686825008)(./images/image-20191231142056554.png)]

查看控制檯打印的SQL查詢語句

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8B1ETEwk-1591686825011)(./images/image-20191231142114105.png)]

還能夠打開Redis客戶端可視化管理工具Redis Desktop Manager鏈接本地啓用的Redis服務,查看具體的數據緩存效果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-I9RlUe0B-1591686825014)(./images/image-20191231142353290.png)]


執行findById()方法查詢出的用戶評論信息Comment正確存儲到了Redis緩存庫中名爲comment的名稱空間下。其中緩存數據的惟一標識key值是以「名稱空間comment::+參數值(comment::1)」的字符串形式體現的,而value值則是通過JDK默認序列格式化後的HEX格式存儲。這種JDK默認序列格式化後的數據顯然不方便緩存數據的可視化查看和管理,因此在實際開發中,一般會自定義數據的序列化格式

(7) 基於註解的Redis緩存更新測試。

先經過瀏覽器訪問「http://localhost:8080/update/1/shitou」更新id爲1的評論做者名爲shitou;

接着,繼續訪問「http://localhost:8080/get/1」查詢id爲1的用戶評論信息

<img
src="./images/image-20191231144329586.png"
alt="image-20191231144329586" style="zoom:67%;" />

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1SuxJaDK-1591686825017)(./images/image-20191231144533512.png)]


能夠看出,執行updateComment()方法更新id爲1的數據時執行了一條更新SQL語句,後續調用findById()方法查詢id爲1的用戶評論信息時沒有執行查詢SQL語句,且瀏覽器正確返回了更新後的結果,代表@CachePut緩存更新配置成功

(8)基於註解的Redis緩存刪除測試


經過瀏覽器訪問「http://localhost:8080/deleteComment?id=1」刪除id爲1的用戶評論信息;


執行deleteComment()方法刪除id爲1的數據後查詢結果爲空,以前存儲在Redis數據庫的comment相關數據也被刪除,代表@CacheEvict緩存刪除成功實現


經過上面的案例能夠看出,使用基於註解的Redis緩存實現只須要添加Redis依賴並使用幾個註解能夠實現對數據的緩存管理。另外,還能夠在Spring Boot全局配置文件中配置Redis有效期,示例代碼以下:

# 對基於註解的Redis緩存數據統一設置有效期爲1分鐘,單位毫秒

spring.cache.redis.time-to-live=60000


上述代碼中,在Spring Boot全局配置文件中添加了「spring.cache.redis.time-to-live」屬性統一配置Redis數據的有效期(單位爲毫秒),但這種方式相對來講不夠靈活。

上了拉勾教育的《Java工程師高薪訓練營》,作一下筆記。但願拉勾能給我推到想去的公司,目標:字節!!

相關文章
相關標籤/搜索