|
SpringBoot中Spring-cache與Redis整合【面試+工作】84
發表時間:2018-11-10 17:54 也是在整合redis的時候偶然間發現spring-cache的。這也是一個不錯的框架,與spring的事務使用類似,只要添加一些注解方法,就可以動態的去操作緩存了,減少代碼的操作。如果這些注解不滿足項目的需求,我們也可以參考spring-cache的實現思想,使用AOP代理+緩存操作來管理緩存的使用。 在這個例子中我使用的是redis,當然,因為spring-cache的存在,我們可以整合多樣的緩存技術,例如Ecache、Mamercache等。 下面來看springcache的具體操作吧! 附上官方的文檔: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html redis中整合spring-cache
Linux下安裝Redis1.tar zxvf redis-2.6.14.tar.gz 解壓文件2.make指令進行編譯 ![]() 3.創建Redis目錄,并拷貝兩個文件 ![]() 4.將/home/lzl/rdtar/redis-2.6.14目錄下的redis-conf拷貝到/usr/local/redis中 ![]() 5.在/usr/local/redis目錄下啟動Redis服務 ![]() 6.設置Redis為后臺啟動程序,在redis.conf文件中進行設置。 ![]() 7.在./redis-cli中存儲數據 ![]() Redis的Key-ValueKey的命名規則除了空格、\n換行外其他的大部分字符都可以使用。Key的常用操作 ![]() String類型操作
具體操作 ![]() mset key1 key2 … 設置多個key值mget key1 key2 … 獲取多個key值incr 類似于i++的操作,需要保證value值是整型。創建之后默認為1decr 類似于i–。append 追加字符串substr 截取字符串 ![]() List類型的操作 Redis的List是一個雙向鏈表。通過push和pop操作添加和刪除元素,既可以當做隊列也可以當做棧來使用。應用場景:可以在Redis的List里保留登錄時間最近的10個數據,每次進來一個新登錄者就刪除一個數據,每次在鏈表中獲取對應的信息,極大的減少資源的消耗。具體操作 ![]() lpush 頂部添加元素 棧lpop 刪除頂部元素 棧rpush 添加底部元素 隊列rpop 刪除底部元素 隊列lrange key1 start end 查看區間數據llen 查看List長度ltrim key1 start end 截取指定區間的數據 ![]() Set類型的操作redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素 關于set集合除了基本的添加刪除操作,其他有用的操作還包含集合的 取并集,交集,差集。通過這些操作可以很通容易的實現sns中的好友推薦功能。 具體操作 ![]() ![]() ![]() SortSet排序集合類型和set集合一樣是string類型元素的集合,不同的是每個元素都會關聯一個權通過權值可以有序的獲取集合中的元素。應用場景:熱門帖子的查詢sort set排序集合,都是有值和權來組成。通過權值的比較,來進行排序。具體操作 ![]() Hash數據類型 ![]() 持久化功能snap shotting快照持久化該持久化默認開啟,一次性把redis中全部的數據保存一份存儲在硬盤中,如果數據非常多就不適合頻繁該持久化操作。 持久化設置在redis.conf文件中,可以有以下的保存設置 ![]() Redis的key單位之間內變化的越多,快照保存的時間越快。手動發起快照持久化指令 ./redis-cli bgsave ![]() 精細持久化(AOF持久化)本質:把用戶執行的每個“寫”指令(添加、刪除、修改)都備份到文件中,還原數據的時候就是執行具體指令而已。 開啟AOF持久化。 將appendonly no改為appendonly yes ![]() 快照設置的三種模式,推薦使用第二種。 ![]() 內容優化壓縮處理命令: ./redis-cli bgrewriteaof配置Redis主從服務器可以把redis看做是一個處理速度很快的數據庫,一個工程項目中可以設置多個redis服務器,來緩解多用戶的請求壓力。這里可以設置主Redis服務器進行增、刪、改操作。可以配置多個Redis從服務器來進行查詢操作。 主要設置還是在redis.conf文件中進行配置。 從服務器的配置如下:寫上主服務器的ip以及端口號即可。 ![]() 2. redis知識技能同時,要了解redis自身的知識體系,基本的key、map、list等的操作命令。 ![]() ![]() ![]() 3. springboot的環境使用maven在pom文件中導入springboot的依賴(這里提供一個demo,歡迎star)鏈接:http://pan.baidu.com/s/102RYeBdw9LPFbPogEpCSSQ 密碼:ioo5redis的環境依賴注意spring-boot-starter-data-redis與springboot版本的問題。我項目中使用的springboot版本是1.3.8, ![]() 但是spring-boot-starter-data-redis只有1.4版本以上的。所以要指定spring-boot-starter-data-redis的version版本。 ![]() redis配置文件在application.properties文件中寫下連接redis所需要的信息。 ![]() RedisCacheConfig配置主要分3個步驟
![]() 從源碼看,RedisTemplate默認使用的是JdkSerializationRedisSerializer。我的項目中選擇Jackson2JsonRedisSerializer的序列化器 此時,需要引入Jackson的依賴 ![]() ![]() ![]() 以上完成后,環境配置基本完成,接下來需要驗證springboot與redis是否整合成功。1.啟動redis服務 ![]() 控制臺出現這個畫面,說明啟動成功! 2. 寫一個testCase實例驗證 ![]() 結果如下所示,并且redis緩存中存儲的是json的格式。 如果我們存入一個對象,那個這個對象也將是json的格式。 ![]() 需要注意的地方 第一次配置redis的時候,application.properties文件設置 ![]() 說明使用的redis數據庫為2,那么需要將redis切換到數據庫2的目錄中才能看到redis的值 在redis客戶端使用如下命令 ![]() ![]() 然后再進行redis的操作。SDR(spring-data-redis)的官方講解如下 http://docs.spring.io/spring-data/redis/docs/1.8.1.RELEASE/reference/html/#redis:template 緩存的配置如下
![]()
![]()
![]() 在RedisCacheConfig中添加以上的代碼,就可以使用springcache的注解了。下面介紹springcache的注解如何使用 spring cache與redis緩存結合對springCache概念的了解 ![]() 緩存的主要使用方式包括以下兩方面 1. 緩存的聲明,需要根據項目需求來妥善的應用緩存 2. 緩存的配置方式,選擇需要的緩存支持,例如Ecache、redis、memercache等 緩存的注解介紹![]() @CacheConfig該注解是可以將緩存分類,它是類級別的注解方式。我們可以這么使用它。 這樣的話,UseCacheRedisService的所有緩存注解例如@Cacheable的value值就都為user。 ![]() 在redis的緩存中顯示如下 ![]() 我們注意到,生成的user~keys,它是一個zset類型的key,如果使用get會報WRONGTYPE Operation against a key holding the wrong kind of value。這個問題坑了我很久 @Cacheable一般用于查詢操作,根據key查詢緩存.
![]() ![]() 調用方式。 ![]() 打印結果,大家也可以試一試 只輸出一次sql查詢的語句,說明第二次查詢是從redis中查到的。 ![]() redis中的結果 我們可以看到redis中已經存在 com.lzl.redisService.UseCacheRedisService.selectAllUser.記錄了。 這么長的一串字符key是根據自定義key值生成的。 ![]() @CachePut一般用于更新和插入操作,每次都會請求db 通過key去redis中進行操作。 1. 如果key存在,更新內容 2. 如果key不存在,插入內容。 ![]() redis中的結果 多了一條記錄user_2 ![]() @CacheEvict根據key刪除緩存中的數據。allEntries=true表示刪除緩存中的所有數據。 ![]() 測試方法 ![]() redis中的結果 user_1已經移除掉。 ![]() 測試allEntries=true時的情形。 ![]() redis中的結果 redis中的數據已經全部清空 ![]() @Caching通過注解的屬性值可以看出來,這個注解將其他注解方式融合在一起了,我們可以根據需求來自定義注解,并將前面三個注解應用在一起 ![]() 使用例子如下 ![]() ![]() redis中的執行結果 一次添加三個key ![]() 結合@Caching還可以設置自定義的注解 自定義注解![]() 使用如下 ![]() 測試 ![]() redis結果 ![]() 通過以上的例子基本可以了解springcache的使用了,當然還有更加復雜的操作,這里只是簡單的介紹一下,運用到實際的項目中還是有所欠缺的。不過有這個基礎應該不會太難。同時有時間可以再研究一下spring-cache的實現原理。是基于AOP的實現的,這也是我們在項目中學習的地方。 遇到的兩個問題WRONGTYPE Operation against a key holding the wrong kind of value這個就是上面所說的類型不一致,使用redis命令不當造成的。所以在查找redis的value時候,需要知道key的類型。 ![]() Invalid argument(s)還是redis現實的錯誤,這個有些困惑,在get的時候,一定要加上”“(引號)才行。 ![]() |