今天小編給大家分享一下springboot緩存之redis整合的方法的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
創(chuàng)新互聯(lián)是專業(yè)的錦屏網(wǎng)站建設(shè)公司,錦屏接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行錦屏網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!默認(rèn)使用的是ConcurrentMapCacheManager的ConcurrentMapCache作為緩存組件。
使用ConcurrentMap的時(shí)候,是將數(shù)據(jù)保存在ConcurrentMap<Object,Object>
當(dāng)中的。
實(shí)際在開發(fā)過(guò)程中,我們經(jīng)常使用的,是一些緩存中間件的。
比如我們經(jīng)常使用的redis,memcache,包括我們使用的ehcache,等等,我們都是使用一些緩存中間件。
我們之前講解原理的時(shí)候,也發(fā)現(xiàn)了,springboot是支持很多的緩存配置的:
如下圖所示的:
默認(rèn)開始的配置的是:SimpleCacheConfiguration。
其他的緩存是在什么時(shí)候開啟呢?
我們可以ctrl+n搜索一下,這些配置類,然后進(jìn)去看看他們的conditional條件:
這些都是表示,當(dāng)你導(dǎo)入了相應(yīng)的包的時(shí)候,這些配置才會(huì)是生效的哦。
如果有不會(huì)redis這個(gè)技術(shù)的同學(xué),尚硅谷當(dāng)中有周陽(yáng)老師發(fā)布的redis系列的講解視頻。或者大家可以最快地訪問(wèn)redis的官方網(wǎng)站,來(lái)進(jìn)行學(xué)習(xí),redis.cn是redis學(xué)習(xí)的中文網(wǎng)。
搜索redis鏡像
這個(gè)是連接國(guó)外的倉(cāng)庫(kù),速度是比較慢的。
我們推薦使用docker 中國(guó)。
docker pull registry.docker-cn.com/library/redis
docker run -d -p 6379:6379 --name myredis [REPOSITORY] docker ps
為了測(cè)試,打開redis的連接工具。
我們引入了redis的starter之后,redisAutoConfiguration就起作用了。
這個(gè)RedisAutoConfiguration是給容器當(dāng)中加入了兩個(gè)組件:
給容器中加入的組件,一個(gè)是叫做RedisTemplate,一個(gè)是叫做StringRedisTemplate,兩個(gè)東西。
這兩個(gè)東西就是用來(lái)操作redis的。
這就跟大家以前用的jdbcTemplate一樣,用來(lái)操作數(shù)據(jù)庫(kù)的東西。
這就是spring用來(lái)簡(jiǎn)化操作redis的兩個(gè)template,如果在程序當(dāng)中想要用這兩個(gè)東西,就自動(dòng)注入就可以了。
redis操作list:
這些看不懂的玩意,全部都是序列化的結(jié)果。
默認(rèn)的序列化器,就是使用的JdkSerializationRedisSerializer。
默認(rèn)的序列化器,就是使用的JDK的序列化器。
我們來(lái)切換成json的序列化器,就可以了。
在測(cè)試類當(dāng)中,自動(dòng)注入我們自己配置的redisTemplate。
然后我們?cè)俅螠y(cè)試保存對(duì)象。
這就說(shuō)明了,我們的序列化器修改成功了。
這就說(shuō)明白了,如果我們后面要保存對(duì)象的時(shí)候,我們經(jīng)常是要修改序列化器的。
我們之前使用的是ConCurrentMap的緩存管理器的。
這個(gè)緩存管理器,幫我們來(lái)創(chuàng)建出來(lái)緩存組件的。
緩存組件來(lái)實(shí)際給緩存中,進(jìn)行CRUD的工作的。
現(xiàn)在我們引入了redis之后,會(huì)發(fā)生什么樣的效果呢?
我們還是在application.properties當(dāng)中將debug=true,這樣就可以將自動(dòng)配置報(bào)告來(lái)打開。
這樣的時(shí)候,我們重新啟動(dòng)我們的程序,在控制臺(tái)當(dāng)中,我們?nèi)ニ阉饕幌隆?br/>看看是哪一個(gè)自動(dòng)配置類,是生效的呢?
原來(lái)默認(rèn)開啟的是:SimpleCacheConfiguration的。
現(xiàn)在我們引入了redis相關(guān)的starters之后,程序默認(rèn)開啟的是RedisCacheConfiguration了。
啟動(dòng)程序,直接進(jìn)行測(cè)試就可以了。
說(shuō)明第一次查詢的時(shí)候,是查詢數(shù)據(jù)庫(kù)了。
第二次查詢的時(shí)候,控制臺(tái)是沒有任何輸出的,說(shuō)明是查詢了緩存了。
緩存默認(rèn)是只有redis開啟的。
那么肯定是在redis當(dāng)中了。
我們可以查看一下:
這個(gè)說(shuō)明一個(gè)問(wèn)題,在k和v都是object的時(shí)候,默認(rèn)保存對(duì)象的時(shí)候,利用序列化來(lái)保存的。我們是想要讓redis自動(dòng)保存為json的。
我們應(yīng)該怎么做呢?
我們先來(lái)分析一下這些過(guò)程當(dāng)中的原理。
1、我們是引入了redis的starter,所以我們的cachemanager變?yōu)榱藃ediscachemanager了,
2、默認(rèn)創(chuàng)建的rediscachemanager在操作我們的數(shù)據(jù)的時(shí)候,傳入了一個(gè)redistemplate的東西。
3、這個(gè)redistemplate是redisautoconfiguration幫我們創(chuàng)建的。這個(gè)redistemplate默認(rèn)使用的序列化機(jī)制是jdkserializationredisserializer
的。這個(gè)就是相當(dāng)于,redis默認(rèn)給我們防止的redisCacheManager還不太符合我們的要求的。
我們?cè)趺崔k呢?
我們應(yīng)該自定義CacheManager的。
這個(gè)時(shí)候,我們?cè)賳?dòng)項(xiàng)目,來(lái)進(jìn)行測(cè)試,這個(gè)時(shí)候,我們就可以看到redis當(dāng)中的結(jié)果,是我們想要的了。
韞秋下次面試的時(shí)候,就可以問(wèn)那些想要來(lái)軟件園的人,說(shuō),你知道redis starter保存對(duì)象的時(shí)候,redisTemplate默認(rèn)的序列化規(guī)則是什么嗎?
如果我們?cè)谑褂胷edis的過(guò)程中,我們想要修改默認(rèn)的序列化規(guī)則,我們應(yīng)該怎么做呢?
我們可以自定義redisCacheManager,然后自定義redisTemplate,在redisTemplate當(dāng)中傳入json相關(guān)的序列化器的哦。
我們?cè)跀?shù)據(jù)庫(kù)當(dāng)中的,department表當(dāng)中,放進(jìn)去一條數(shù)據(jù):
我們寫一個(gè)對(duì)應(yīng)的department操作的mapper。
我們?cè)賹懸粋€(gè)對(duì)應(yīng)的service
然后我們看看redis當(dāng)中,是否是有數(shù)據(jù)的呢?
我們看了,redis當(dāng)中dept相關(guān)的數(shù)據(jù),是有的。
我們第二次來(lái)查詢dept的時(shí)候,就應(yīng)該走緩存redis了。
但是我們第二次去查詢的,時(shí)候,出現(xiàn)了下面的錯(cuò)誤。
上面報(bào)錯(cuò)的意思就是說(shuō),不能夠去讀取json的。
因?yàn)槭且巡块T的json對(duì)象,轉(zhuǎn)換成為員工的json對(duì)象,這是不可以的。
這個(gè)就是因?yàn)椋覀兎胖玫膔edisCacheManager是操作員工的。
所以,現(xiàn)在我們看到的這個(gè)效果,就是很神奇的哦。
緩存的數(shù)據(jù),能夠存入到redis當(dāng)中。
但是我們第二次從緩存中查詢的時(shí)候,就不能夠反序列化回來(lái)了。
原來(lái)就是,我們存的是dept的json的數(shù)據(jù),我們的cachemanager,默認(rèn)是用employee的template來(lái)操作redis的。
這個(gè)東西只能夠?qū)mployee的數(shù)據(jù)反序列化過(guò)來(lái)的。
這個(gè)時(shí)候,就等于有了2個(gè)redisCacheManager了,我們用哪個(gè)呢?
我們?cè)趕ervice當(dāng)中,是可以指定的。
然后我們重啟項(xiàng)目,結(jié)果是報(bào)錯(cuò)了:
如果,我們是有多個(gè)cacheManager的話,我們一定是要把某一個(gè)cacheManager作為,我們的默認(rèn)配置的緩存管理器的。
比如,我們可以進(jìn)行下面的操作,來(lái)修復(fù)這個(gè)啟動(dòng)報(bào)錯(cuò)的內(nèi)容的呢:
這個(gè)時(shí)候,看看,我們?cè)谶M(jìn)行第二次部門查詢的時(shí)候,能不能夠正常地,成功地,從redis當(dāng)中反序列化地讀取到,我們的部門信息呢?
這個(gè)時(shí)候,我們就發(fā)現(xiàn),不管是員工還是部門,我們都是可以從redis當(dāng)中反序列化成功查詢的。
這個(gè)就是很完美的啦。
前面我們說(shuō)的,全部都是使用注解的方式,來(lái)給緩存當(dāng)中,來(lái)放置數(shù)據(jù)的。
但是,在開發(fā)當(dāng)中,我們經(jīng)常會(huì),遇到這樣的情況。
就是,我們開發(fā)進(jìn)行到某個(gè)階段,我們是需要將一些數(shù)據(jù),放到緩存當(dāng)中的。
我們是需要,使用編碼的方式,來(lái)操作緩存的。
比如我們?cè)诓樵兂鰜?lái)了部門的信息之后,就希望把這個(gè)信息,放入到redis當(dāng)中。
我們可以把部門的cacheManager注入進(jìn)來(lái)。
然后我們?cè)诰幋a的過(guò)程中,可以通過(guò)操作這個(gè)cacheManager來(lái)獲取緩存,
然后,再操作緩存組件,來(lái)對(duì)數(shù)據(jù)進(jìn)行增刪改查。
我們對(duì)上面的代碼,啟動(dòng)項(xiàng)目進(jìn)行測(cè)試,發(fā)現(xiàn)是可以的,是成功地給redis當(dāng)中放進(jìn)去了數(shù)據(jù)的:
以上就是“springboot緩存之redis整合的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:springboot緩存之redis整合的方法-創(chuàng)新互聯(lián)
本文路徑:http://chinadenli.net/article48/cdpshp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、ChatGPT、搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容