首頁  >  文章  >  資料庫  >  springboot快取之redis整合的方法

springboot快取之redis整合的方法

WBOY
WBOY轉載
2023-05-30 13:22:12730瀏覽

    預設使用的是ConcurrentMapCacheManager的ConcurrentMapCache作為快取元件。

    使用ConcurrentMap的時候,是將資料保存在ConcurrentMap<object></object>當中的。

    實際上在開發過程中,我們經常使用的,是一些快取中間件的。

    例如我們常用的redis,memcache,包括我們使用的ehcache,等等,我們都是用一些快取中間件。

    我們之前講解原理的時候,也發現了,springboot是支援很多的快取配置的:

    如下圖所示的:

    springboot快取之redis整合的方法

    預設開始的設定的是:SimpleCacheConfiguration。

    其他的快取是在什麼時候開啟呢?

    我們可以ctrl n搜尋一下,這些配置類,然後進去看看他們的conditional條件:

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    這些都是表示,當你導入了對應的套件的時候,這些配置才會是生效的哦。

    整合redis作為快取

    如果有不會redis這個技術的同學,尚矽谷當中有周陽老師發布的redis系列的講解影片。或者大家可以最快造訪redis的官方網站,來進行學習,redis.cn是redis學習的中文網。

    安裝redis

    搜尋redis鏡像

    springboot快取之redis整合的方法

    #這個是連接國外的倉庫,速度是比較慢的。

    我們推薦使用docker 中國。

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    docker pull registry.docker-cn.com/library/redis

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    #啟動redis映像

    docker run -d -p 6379:6379 --name myredis [REPOSITORY]
    docker ps

    為了測試,開啟redis的連線工具。

    redis desktop manager

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    測試redis常用的資料操作

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    redis操作list

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    #redis的set動作

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    #引入redis的starter

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    配置redis

    springboot快取之redis整合的方法

    #簡單說下redis原理

    我們在引入了redis的starter之後,redisAutoConfiguration就起作用了。

    springboot快取之redis整合的方法

    這個RedisAutoConfiguration是為容器當中加入了兩個元件:

    springboot快取之redis整合的方法

    給容器中加入的元件,一個是叫做RedisTemplate,一個是叫做StringRedisTemplate,兩個東西。

    這兩個東西就是用來操作redis的。

    這就跟大家以前用的jdbcTemplate一樣,用來操作資料庫的東西。

    這就是spring用來簡化操作redis的兩個template,如果在程式當中想要用這兩個東西,就自動注入就可以了。

    springboot快取之redis整合的方法

    redis測試

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    redis操作list:

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    #redis測試保存物件

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法這些看不懂的玩意,全部都是序列化的結果。

    redisTemplate預設的序列化規則

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法#預設的序列化器,就是使用的JdkSerializationRedisSerializer。

    預設的序列化器,就是使用的JDK的序列化器。

    我們來切換成json的序列化器,就可以了。

    redis配置springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    ###在測試類別當中,自動注入我們自己配置的redisTemplate。 ###############然後我們再次測試保存物件。 ########################這就說明了,我們的序列化器修改成功了。 ######這就說明白了,如果我們後面要保存物件的時候,我們常常是要修改序列化器的。 ###############測試快取############

    我們之前使用的是ConCurrentMap的快取管理器的。
    這個快取管理器,幫我們來建立出來快取元件的。
    快取元件來實際給快取中,進行CRUD的工作的。

    現在我們引進了redis之後,會發生什麼樣的效果呢?
    我們還是在application.properties當中將debug=true,這樣就可以將自動設定報表來開啟。
    這樣的時候,我們重新啟動我們的程序,在控制台當中,我們去搜尋一下。
    看看是哪一個自動設定類,是生效的呢?

    springboot快取之redis整合的方法

    原來預設開啟的是:SimpleCacheConfiguration的。

    現在我們引進了redis相關的starters之後,程式預設開啟的是RedisCacheConfiguration了。

    springboot快取之redis整合的方法

    啟動程序,直接進行測試就可以了。

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    說明第一次查詢的時候,就是查詢資料庫了。

    第二次查詢的時候,控制台是沒有任何輸出的,表示是查詢了快取了。

    快取預設是只有redis開啟的。

    那麼肯定是在redis當中了。

    我們可以查看一下:

    springboot快取之redis整合的方法

    這個說明一個問題,在k和v都是object的時候,預設保存物件的時候,利用序列化來保存的。我們是想要讓redis自動儲存為json的。

    我們該怎麼做呢?

    我們先來分析這些過程當中的原理。

    1、我們是引入了redis的starter,所以我們的cachemanager變為了rediscachemanager了,

    2、預設創建的rediscachemanager在操作我們的資料的時候,傳入了一個redistemplate的東西。

    springboot快取之redis整合的方法

    3、這個redistemplate是redisautoconfiguration幫我們創建的。這個redistemplate預設使用的序列化機制是jdkserializationredisserializer的。這個就是相當於,redis預設給我們防止的redisCacheManager還不太符合我們的要求的。

    我們該怎麼辦?

    我們應該自訂CacheManager的。

    自訂redisCacheManager

    springboot快取之redis整合的方法

    這個時候,我們再啟動項目,來進行測試,這個時候,我們就可以看到redis當中的結果,是我們想要的了。

    springboot快取之redis整合的方法

    韞秋下次面試的時候,就可以問那些想要來軟體園區的人,說,你知道redis starter保存物件的時候,redisTemplate預設的序列化規則是什麼嗎?

    如果我們在使用redis的過程中,我們想要修改預設的序列化規則,我們該怎麼做呢?

    我們可以自訂redisCacheManager,然後自訂redisTemplate,在redisTemplate當中傳入json相關的序列化器的哦。

    springboot快取之redis整合的方法

    遺留的小問題

    資料庫

    我們在資料庫當中的,department表當中,放進去一條資料:

    springboot快取之redis整合的方法

    mapper

    我們寫一個對應的department操作的mapper。

    springboot快取之redis整合的方法

    service

    我們再寫一個對應的service

    springboot快取之redis整合的方法

    controller

    springboot快取之redis整合的方法

    啟動專案測試

    springboot快取之redis整合的方法

    然後我們看看redis當中,是否是有資料的呢?

    springboot快取之redis整合的方法

    我們看了,redis當中dept相關的數據,是有的。

    我們第二次來查詢dept的時候,就應該走快取redis了。

    但是我們第二次去查詢的,時候,出現了下面的錯誤。

    錯誤

    springboot快取之redis整合的方法

    上面報錯的意思就是說,不能夠去讀取json的。

    因為是要把部門的json對象,轉換成員工的json對象,這是不可以的。

    這個就是因為,我們放置的redisCacheManager是操作員工的。

    springboot快取之redis整合的方法

    所以,現在我們看到的這個效果,就是很神奇的。

    快取的數據,能夠存入redis當中。

    但是我們第二次從快取中查詢的時候,就不能夠反序列化回來了。

    原來就是,我們存的是dept的json的數據,我們的cachemanager,預設是用employee的template來操作redis的。

    這個東西只能夠將employee的資料反序列化過來的。

    解決錯誤

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    #這個時候,就等於有了2個redisCacheManager了,我們用哪一個呢?

    我們在service當中,是可以指定的。

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    然後我們重新啟動項目,結果是報錯了:

    springboot快取之redis整合的方法

    如果,我們是有多個cacheManager的話,我們一定是要把某一個cacheManager作為,我們的預設配置的快取管理器的。

    例如,我們可以進行下面的操作,來修復這個啟動報錯的內容的呢:

    springboot快取之redis整合的方法

    #重新啟動進行專案測試

    這個時候,看看,我們在進行第二次部門查詢的時候,能不能夠正常地,成功地,從redis當中反序列化地讀取到,我們的部門資訊呢?

    springboot快取之redis整合的方法

    springboot快取之redis整合的方法

    這個時候,我們就發現,不管是員工還是部門,我們都是可以從redis當中反序列化成功查詢的。

    這個就是很完美的啦。

    編碼的方式操作快取

    前面我們說的,全部都是使用註解的方式,來給快取當中,來放置資料的。

    但是,在開發當中,我們常常會,遇到這樣的情況。

    就是,我們開發進行到某個階段,我們是需要將一些數據,放到快取當中的。

    我們是需要,使用編碼的方式,來操作快取的。

    例如我們在查詢出來了部門的資訊之後,就希望把這個訊息,放入到redis當中。

    我們可以把部門的cacheManager注入進來。

    springboot快取之redis整合的方法

    然後我們在編碼的過程中,可以透過操作這個cacheManager來取得緩存,

    然後,再操作快取元件,來對資料進行增刪改查。

    springboot快取之redis整合的方法

    我們對上面的程式碼,啟動專案進行測試,發現是可以的,是成功地給redis當中放進去了資料的:

    springboot快取之redis整合的方法

    以上是springboot快取之redis整合的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除