今天小編給大家分享一下springboot緩存之redis整合的方法的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
默認使用的是ConcurrentMapCacheManager的ConcurrentMapCache作為緩存組件。
使用ConcurrentMap的時候,是將數據保存在ConcurrentMap<Object,Object>
當中的。
實際在開發過程中,我們經常使用的,是一些緩存中間件的。
比如我們經常使用的redis,memcache,包括我們使用的ehcache,等等,我們都是使用一些緩存中間件。
我們之前講解原理的時候,也發現了,springboot是支持很多的緩存配置的:
如下圖所示的:
默認開始的配置的是:SimpleCacheConfiguration。
其他的緩存是在什么時候開啟呢?
我們可以ctrl+n搜索一下,這些配置類,然后進去看看他們的conditional條件:
這些都是表示,當你導入了相應的包的時候,這些配置才會是生效的哦。
如果有不會redis這個技術的同學,尚硅谷當中有周陽老師發布的redis系列的講解視頻?;蛘叽蠹铱梢宰羁斓卦L問redis的官方網站,來進行學習,redis.cn是redis學習的中文網。
搜索redis鏡像
這個是連接國外的倉庫,速度是比較慢的。
我們推薦使用docker 中國。
docker pull registry.docker-cn.com/library/redis
docker run -d -p 6379:6379 --name myredis [REPOSITORY] docker ps
為了測試,打開redis的連接工具。
我們引入了redis的starter之后,redisAutoConfiguration就起作用了。
這個RedisAutoConfiguration是給容器當中加入了兩個組件:
給容器中加入的組件,一個是叫做RedisTemplate,一個是叫做StringRedisTemplate,兩個東西。
這兩個東西就是用來操作redis的。
這就跟大家以前用的jdbcTemplate一樣,用來操作數據庫的東西。
這就是spring用來簡化操作redis的兩個template,如果在程序當中想要用這兩個東西,就自動注入就可以了。
redis操作list:
這些看不懂的玩意,全部都是序列化的結果。
默認的序列化器,就是使用的JdkSerializationRedisSerializer。
默認的序列化器,就是使用的JDK的序列化器。
我們來切換成json的序列化器,就可以了。
在測試類當中,自動注入我們自己配置的redisTemplate。
然后我們再次測試保存對象。
這就說明了,我們的序列化器修改成功了。
這就說明白了,如果我們后面要保存對象的時候,我們經常是要修改序列化器的。
我們之前使用的是ConCurrentMap的緩存管理器的。
這個緩存管理器,幫我們來創建出來緩存組件的。
緩存組件來實際給緩存中,進行CRUD的工作的。
現在我們引入了redis之后,會發生什么樣的效果呢?
我們還是在application.properties當中將debug=true,這樣就可以將自動配置報告來打開。
這樣的時候,我們重新啟動我們的程序,在控制臺當中,我們去搜索一下。
看看是哪一個自動配置類,是生效的呢?
原來默認開啟的是:SimpleCacheConfiguration的。
現在我們引入了redis相關的starters之后,程序默認開啟的是RedisCacheConfiguration了。
啟動程序,直接進行測試就可以了。
說明第一次查詢的時候,是查詢數據庫了。
第二次查詢的時候,控制臺是沒有任何輸出的,說明是查詢了緩存了。
緩存默認是只有redis開啟的。
那么肯定是在redis當中了。
我們可以查看一下:
這個說明一個問題,在k和v都是object的時候,默認保存對象的時候,利用序列化來保存的。我們是想要讓redis自動保存為json的。
我們應該怎么做呢?
我們先來分析一下這些過程當中的原理。
1、我們是引入了redis的starter,所以我們的cachemanager變為了rediscachemanager了,
2、默認創建的rediscachemanager在操作我們的數據的時候,傳入了一個redistemplate的東西。
3、這個redistemplate是redisautoconfiguration幫我們創建的。這個redistemplate默認使用的序列化機制是jdkserializationredisserializer
的。這個就是相當于,redis默認給我們防止的redisCacheManager還不太符合我們的要求的。
我們怎么辦呢?
我們應該自定義CacheManager的。
這個時候,我們再啟動項目,來進行測試,這個時候,我們就可以看到redis當中的結果,是我們想要的了。
韞秋下次面試的時候,就可以問那些想要來軟件園的人,說,你知道redis starter保存對象的時候,redisTemplate默認的序列化規則是什么嗎?
如果我們在使用redis的過程中,我們想要修改默認的序列化規則,我們應該怎么做呢?
我們可以自定義redisCacheManager,然后自定義redisTemplate,在redisTemplate當中傳入json相關的序列化器的哦。
我們在數據庫當中的,department表當中,放進去一條數據:
我們寫一個對應的department操作的mapper。
我們再寫一個對應的service
然后我們看看redis當中,是否是有數據的呢?
我們看了,redis當中dept相關的數據,是有的。
我們第二次來查詢dept的時候,就應該走緩存redis了。
但是我們第二次去查詢的,時候,出現了下面的錯誤。
上面報錯的意思就是說,不能夠去讀取json的。
因為是要把部門的json對象,轉換成為員工的json對象,這是不可以的。
這個就是因為,我們放置的redisCacheManager是操作員工的。
所以,現在我們看到的這個效果,就是很神奇的哦。
緩存的數據,能夠存入到redis當中。
但是我們第二次從緩存中查詢的時候,就不能夠反序列化回來了。
原來就是,我們存的是dept的json的數據,我們的cachemanager,默認是用employee的template來操作redis的。
這個東西只能夠將employee的數據反序列化過來的。
這個時候,就等于有了2個redisCacheManager了,我們用哪個呢?
我們在service當中,是可以指定的。
然后我們重啟項目,結果是報錯了:
如果,我們是有多個cacheManager的話,我們一定是要把某一個cacheManager作為,我們的默認配置的緩存管理器的。
比如,我們可以進行下面的操作,來修復這個啟動報錯的內容的呢:
這個時候,看看,我們在進行第二次部門查詢的時候,能不能夠正常地,成功地,從redis當中反序列化地讀取到,我們的部門信息呢?
這個時候,我們就發現,不管是員工還是部門,我們都是可以從redis當中反序列化成功查詢的。
這個就是很完美的啦。
前面我們說的,全部都是使用注解的方式,來給緩存當中,來放置數據的。
但是,在開發當中,我們經常會,遇到這樣的情況。
就是,我們開發進行到某個階段,我們是需要將一些數據,放到緩存當中的。
我們是需要,使用編碼的方式,來操作緩存的。
比如我們在查詢出來了部門的信息之后,就希望把這個信息,放入到redis當中。
我們可以把部門的cacheManager注入進來。
然后我們在編碼的過程中,可以通過操作這個cacheManager來獲取緩存,
然后,再操作緩存組件,來對數據進行增刪改查。
我們對上面的代碼,啟動項目進行測試,發現是可以的,是成功地給redis當中放進去了數據的:
以上就是“springboot緩存之redis整合的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。