當前位置:
首頁 > 知識 > 帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

對於緩存也說了比較多了,大家對下圖這一堆配置類現在應該有些很粗略的認識了(因為我也就很粗略的認識了一下,哈哈!),咳,那麼我們怎麼切換這個緩存呢?(就是不用springboot提供的默認的SimpleCacheConfiguration,用其他緩存公司提供的)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

打開今日頭條,查看更多精彩圖片

就像我們使用資料庫一樣,從mysql換到orcle,不需要把我們所有的配置都改一遍吧,只需要改一下資料庫驅動,再修改一些配置就ok了,一些主要的東西都是不變的。

我們用切換redis一樣,只需要修改一點東西,那些@Cacheable註解什麼的,還是一樣的用。

而且比較好玩的是的上面這些配置類是按照從上到下的順序依次嘗試載入的,例如redis那個配置類載入成功,默認的SimpleCacheConfiguration就失效了。理由嘛,很簡單,看下圖;

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

1.redis簡單使用

springboot自帶的緩存是不用下載的,已經給你安裝好了,但是redis是第三方提供的,可以看作一個軟體,需要額外下載的,然後springboot通過一個starter和這個redis軟體適配,然後就能夠使用了。

當然,會用docker更好(強烈建議學會使用docker,快速安裝一切,mysql,tomcat,redis等等),幾十秒鐘redis就能下載好並啟動,不過新手嘛,還是常規操作,嘿嘿!

哎,我還特地去github下載了一個redis,有興趣的小夥伴可以試試https://github.com/ServiceStack/redis-windows,直接下載zip,解壓,隨便選個版本放到一個指定文件夾,繼續解壓。(這裡就是簡單用一下redis,不搞花里胡哨的東西,其實我就是比較懶,我沒配環境變數,沒設置密碼,沒下載可視化工具,需要的小夥伴自己去配置啊!)

準備工作:redis的基本命令要瞄兩眼,記不住沒關係,用到什麼命令直接查啊!

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

一定要在空白的地方哦~當然你也可以在運行打開cmd,emmm...那慢慢切換目錄到這裡吧。。。

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

輸入命令啟動服務端,顯示下面的畫面就啟動成功,默認6379埠;

記住,這個黑窗口不要關了!!!這就是相當於遠程伺服器,關了還用個鬼的redis。

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

繼續剛剛那個位置再打開一個cmd,運行客戶端命令,用幾個簡單粗暴的命令,get set可以用,ok

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

後來補充:emmmm,本來不想用redis可視化工具的,只是寫到後面出了點問題,沒有可視化工具不方便查看數據,哎,打臉!默默地下載了一個。

推薦一個可視化工具,http://www.treesoft.cn/dms.html#exam,選擇TreeNMS,然後下載解壓就可以了,一定要打開readme文件看看怎麼使用。(這個東西居然是用java寫的,直接在瀏覽器輸入網址就可以使用,跟之前的Druid用法幾乎一樣,哈哈,比較方便,當然最重要的是免費!本來想下載一個RedisDesktopManager的,結果發現居然要收費了,弄個破解版又比較懶。。。)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

2.springboot整合redis

ok,現在開始整合springboot+redis,在springboot需要導入依賴,就是導入一個stater

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

yml再配置一下redis的遠程ip地址,我們就是localhost,所以直接用spring.redis.host: localhost,

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

好了,到這裡可以說redis基本的配置就完成了,以前該怎麼用,現在還是怎麼用!!!只是使用的redis的話現在就可以正常使用了!

我們啟動應用也能在控制台發現redis已經啟動。

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

比較深入一點的配置

service中的方法存數據就是向redis中存,但是假如我們想要在代碼中獲取緩存中的東西怎麼辦?例如以前用的JdbcTemplate,我們取連接成功mysql,但是我們在Dao里要得到資料庫里的東西,我們就可以用JdbcTemplate的某些方法的獲取,也可以插入數據;

同理,我們想要在代碼中獲取緩存里的數據,也有xxxTempalte方便我們的使用。

打開RedisAutoConfiguration,只要導入了redis依賴,這個自動配置類就會生效,然後向容器里導入兩個模板

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

我們要用的話,直接@Autowired就行了,這個我用的比較少(方法太多有的時候還要想好久才知道用哪個),我比較喜歡用@Autowired注入CacheManager,然後通過cacheManager.getCache(「指定的cacheName名字」)就能獲得Cache,然後直接存數據比較簡單粗暴一點,哈哈。

簡單的看一看模板的方法,具體的用法百度一下很多。

兩個模板的方法幾乎一樣,只是一個針對對象,一個針對字元串。

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

模板的這麼多方法就是對redis支持的所有數據類型進行操作,例如字元串,list,set,有序的set等等

自己查查資料,也簡單的測試一下就ok,什麼時候用到什麼時候再來研究吧!

開始測試,輸入url,看看緩存數據 ,但是看不懂,這樣很不好,因為我們要看看數據的正確性如何。。。(沒有可視化工具很煩躁,我都不知道key是什麼,查了一下用keys *查看所有的key,然後有個stu,這個是我設置的cacheName,可以自己判斷那個是你的key),那就要配置一下緩存管理器才能轉化一下數據讓我們看懂了。

【注意:假如沒有數據,看看你們的javabean有沒有實現Serializable介面,沒有實現的話應該會報錯的。。。】

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

緩存管理器:

我們先看一看RedisCacheConfiguration這個配置類,打開

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

我都不用打開那個creatRedisCache這個方法內創建RedisCache對象的內部,裡面肯定有lookup,put,remove方法或者封裝一下,這個就不多說了,幾乎和上一節一模一樣。

這裡稍微提一下上面那兩個模板的作用:要載入RedisCacheConfiguration------------->首先會載入RedisAutoCOnfiguration---------->自動配置類往容器里載入兩個模板--------->RedisCacheConfiguration起作用,往容器里導入緩存管理器,緩存管理器內部就是用這兩個模板才能實現和redis實現交互(CacheManager內部使用那兩個模板操作redis,springboot1.5.9之前的版本還能從源碼看到,現在已經看不到了,估計是進行封裝了,有興趣的可以自己查查資料)

為什麼把對象存入redis裡面就變得看不懂了,因為序列化的原因。(序列化就是把一個程序的對象寫在硬碟上)默認使用JDK序列化,具體的可以打開模板類看看,我簡要的截一下圖:

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

jdk序列化我們人肯定是看不懂的,所以我們要用json去序列化,把對象以字元串的樣子寫出來。

這裡有興趣的還可以繼續跟進看看哦~

不扯這麼多了,再說又要增加很多內容,就這樣吧!

下面的這段代碼屬於通用代碼,我在一個老哥的博客那裡找到的,挺管用的,隨便寫個配置類,粘上去就ok,你的redis中的數據就看得懂了。

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

@Configuration
public class MyTemplateCon{
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉換異常的問題
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解決亂碼的問題)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();
return cacheManager;
}
}

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

用過之後,查一下緩存的數據,就可以顯示正常數據了!這裡的數據就是用json序列化的方式

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

緩存就說到這裡了,東西很多,我也是大概說了一部分,其實還有很多東西我都沒有講到,比如@Cacheable...這三個註解裡面每一個屬性的作用,其中keyGenerator比較重要,可以自定義key的生成規則,SpEL表達式我也只是一語帶過,很多源碼也沒有一起看一看;還有,假如在執行service的方法的時候有個需求,就是把所有返回的對象的名字給保存到緩存,應該怎麼做? 代碼和redis的結果如下所示:

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

帶著新人學springboot的應用04(springboot+mybatis+redis 完)

這裡還要說一下springboot的版本差異,我用的是1.5.17,所以最後的那個直接配置一個緩存管理器就ok了,但是我在查這個資料的時候,貌似1.5.9版本還是之前,要先自定義一個RedisTemplate,然後把這個模板傳到自定義的CacheManager中(我就在這個問題糾結了好久。。。),總之,暫時盡量別用2.0版本的,版本太高代碼變化比較大,而且進行過再封裝,學起來難度增加了不少。

我對這一篇寫的內容不是很滿意,我自己都感覺很亂,東西很雜,沒有什麼邏輯性。。。。。幾乎都是我想到什麼就自己測試一下,查查資料,就寫上去了, 東拼西湊的東西,還是水平不夠,下次繼續努力!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

堆、棧、方法區、常量池面試遇到怎麼答?
SQL中常用日期函數

TAG:程序員小新人學習 |