1. 程式人生 > >帶著新人學springboot的應用04(springboot+mybatis+redis 完)

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

  對於快取也說了比較多了,大家對下圖這一堆配置類現在應該有些很粗略的認識了(因為我也就很粗略的認識了一下,哈哈!),咳,那麼我們怎麼切換這個快取呢?(就是不用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寫的,直接在瀏覽器輸入網址就可以使用,哈哈,比較方便,當然最重要的是免費!本來想下載一個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版本的,版本太高程式碼變化比較大,而且進行過再封裝,學起來難度增加了不少。

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