對於緩存也說了比較多了,大家對下圖這一堆配置類現在應該有些很粗略的認識了(因為我也就很粗略的認識了一下,哈哈!),咳,那么我們怎么切換這個緩存呢?(就是不用springboot提供的默認的SimpleCacheConfiguration,用其他緩存公司提供的)
就像我們使用數據庫一樣,從mysql換到orcle,不需要把我們所有的配置都改一遍吧,只需要改一下數據庫驅動,再修改一些配置就ok了,一些主要的東西都是不變的。
我們用切換redis一樣,只需要修改一點東西,那些@Cacheable注解什么的,還是一樣的用。
而且比較好玩的是的上面這些配置類是按照從上到下的順序依次嘗試加載的,例如redis那個配置類加載成功,默認的SimpleCacheConfiguration就失效了。理由嘛,很簡單,看下圖;
1.redis簡單使用
springboot自帶的緩存是不用下載的,已經給你安裝好了,但是redis是第三方提供的,可以看作一個軟件,需要額外下載的,然后springboot通過一個starter和這個redis軟件適配,然后就能夠使用了。
當然,會用docker更好(強烈建議學會使用docker,快速安裝一切,mysql,tomcat,redis等等),幾十秒鍾redis就能下載好並啟動,不過新手嘛,還是常規操作,嘿嘿!
哎,我還特地去github下載了一個redis,有興趣的小伙伴可以試試https://github.com/ServiceStack/redis-windows,直接下載zip,解壓,隨便選個版本放到一個指定文件夾,繼續解壓。(這里就是簡單用一下redis,不搞花里胡哨的東西,其實我就是比較懶,我沒配環境變量,沒設置密碼,沒下載可視化工具,需要的小伙伴自己去配置啊!)
准備工作:redis的基本命令要瞄兩眼,記不住沒關系,用到什么命令直接查啊!
一定要在空白的地方哦~當然你也可以在運行打開cmd,emmm...那慢慢切換目錄到這里吧。。。
輸入命令啟動服務端,顯示下面的畫面就啟動成功,默認6379端口;
記住,這個黑窗口不要關了!!!這就是相當於遠程服務器,關了還用個鬼的redis。
繼續剛剛那個位置再打開一個cmd,運行客戶端命令,用幾個簡單粗暴的命令,get set可以用,ok
后來補充:emmmm,本來不想用redis可視化工具的,只是寫到后面出了點問題,沒有可視化工具不方便查看數據,哎,打臉!默默地下載了一個。
推薦一個可視化工具,http://www.treesoft.cn/dms.html#exam,選擇TreeNMS,然后下載解壓就可以了,一定要打開readme文件看看怎么使用。(這個東西居然是用java寫的,直接在瀏覽器輸入網址就可以使用,跟之前的Druid用法幾乎一樣,哈哈,比較方便,當然最重要的是免費!本來想下載一個RedisDesktopManager的,結果發現居然要收費了,弄個破解版又比較懶。。。)
2.springboot整合redis
ok,現在開始整合springboot+redis,在springboot需要導入依賴,就是導入一個stater
yml再配置一下redis的遠程ip地址,我們就是localhost,所以直接用spring.redis.host: localhost,
好了,到這里可以說redis基本的配置就完成了,以前該怎么用,現在還是怎么用!!!只是使用的redis的話現在就可以正常使用了!
我們啟動應用也能在控制台發現redis已經啟動。
比較深入一點的配置
service中的方法存數據就是向redis中存,但是假如我們想要在代碼中獲取緩存中的東西怎么辦?例如以前用的JdbcTemplate,我們取連接成功mysql,但是我們在Dao里要得到數據庫里的東西,我們就可以用JdbcTemplate的某些方法的獲取,也可以插入數據;
同理,我們想要在代碼中獲取緩存里的數據,也有xxxTempalte方便我們的使用。
打開RedisAutoConfiguration,只要導入了redis依賴,這個自動配置類就會生效,然后向容器里導入兩個模板
我們要用的話,直接@Autowired就行了,這個我用的比較少(方法太多有的時候還要想好久才知道用哪個),我比較喜歡用@Autowired注入CacheManager,然后通過cacheManager.getCache(“指定的cacheName名字”)就能獲得Cache,然后直接存數據比較簡單粗暴一點,哈哈。
簡單的看一看模板的方法,具體的用法百度一下很多。
兩個模板的方法幾乎一樣,只是一個針對對象,一個針對字符串。
模板的這么多方法就是對redis支持的所有數據類型進行操作,例如字符串,list,set,有序的set等等
自己查查資料,也簡單的測試一下就ok,什么時候用到什么時候再來研究吧!
開始測試,輸入url,看看緩存數據 ,但是看不懂,這樣很不好,因為我們要看看數據的正確性如何。。。(沒有可視化工具很煩躁,我都不知道key是什么,查了一下用keys *查看所有的key,然后有個stu,這個是我設置的cacheName,可以自己判斷那個是你的key),那就要配置一下緩存管理器才能轉化一下數據讓我們看懂了。
【注意:假如沒有數據,看看你們的javabean有沒有實現Serializable接口,沒有實現的話應該會報錯的。。。】
緩存管理器:
我們先看一看RedisCacheConfiguration這個配置類,打開
我都不用打開那個creatRedisCache這個方法內創建RedisCache對象的內部,里面肯定有lookup,put,remove方法或者封裝一下,這個就不多說了,幾乎和上一節一模一樣。
這里稍微提一下上面那兩個模板的作用:要加載RedisCacheConfiguration------------->首先會加載RedisAutoCOnfiguration---------->自動配置類往容器里加載兩個模板--------->RedisCacheConfiguration起作用,往容器里導入緩存管理器,緩存管理器內部就是用這兩個模板才能實現和redis實現交互(CacheManager內部使用那兩個模板操作redis,springboot1.5.9之前的版本還能從源碼看到,現在已經看不到了,估計是進行封裝了,有興趣的可以自己查查資料)
為什么把對象存入redis里面就變得看不懂了,因為序列化的原因。(序列化就是把一個程序的對象寫在硬盤上)默認使用JDK序列化,具體的可以打開模板類看看,我簡要的截一下圖:
jdk序列化我們人肯定是看不懂的,所以我們要用json去序列化,把對象以字符串的樣子寫出來。
這里有興趣的還可以繼續跟進看看哦~
不扯這么多了,再說又要增加很多內容,就這樣吧!
下面的這段代碼屬於通用代碼,我在一個老哥的博客那里找到的,挺管用的,隨便寫個配置類,粘上去就ok,你的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; } }
用過之后,查一下緩存的數據,就可以顯示正常數據了!這里的數據就是用json序列化的方式
緩存就說到這里了,東西很多,我也是大概說了一部分,其實還有很多東西我都沒有講到,比如@Cacheable...這三個注解里面每一個屬性的作用,其中keyGenerator比較重要,可以自定義key的生成規則,SpEL表達式我也只是一語帶過,很多源碼也沒有一起看一看;還有,假如在執行service的方法的時候有個需求,就是把所有返回的對象的名字給保存到緩存,應該怎么做? 代碼和redis的結果如下所示:
這里還要說一下springboot的版本差異,我用的是1.5.17,所以最后的那個直接配置一個緩存管理器就ok了,但是我在查這個資料的時候,貌似1.5.9版本還是之前,要先自定義一個RedisTemplate,然后把這個模板傳到自定義的CacheManager中(我就在這個問題糾結了好久。。。),總之,暫時盡量別用2.0版本的,版本太高代碼變化比較大,而且進行過再封裝,學起來難度增加了不少。
我對這一篇寫的內容不是很滿意,我自己都感覺很亂,東西很雜,沒有什么邏輯性。。。。。幾乎都是我想到什么就自己測試一下,查查資料,就寫上去了, 東拼西湊的東西,還是水平不夠,下次繼續努力!