全站資源開放下載,感謝廣大網友的支持
鏈接失效請移步職業司平臺
非盈利平臺

非盈利平臺

只為分享一些優質內容

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

微信小程序

微信小程序

更方便的閱讀

職業司微信公眾號

職業司微信公眾號

實時動態通知

安卓APP

安卓APP

我們從此不分開

程序員生活志-公眾號

程序員生活志-公眾號

程序員生活學習圈,互聯網八卦黑料

支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區

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

1. redis環境準備在使用redis之前需要先安裝redis數據庫,什么是RedisRedis是一個內存高速緩存數據庫,用C語言編寫,數據模型是Key-Value 支持豐富的數據結構類型,比如String,list,hash,set,sorted Set。可持久化,保證數據安全!緩存分為 數據緩存和頁面緩存。 類似于新聞列表等的網站適合做頁面緩存,而商品展示頁面適合做數據緩存。Redis屬于數據緩存的范疇。Redis和memcache比較

  1. Redis支持k/v數據類型,還提供list,set,zset,hash等數據結構的存儲。

  2. Redis支持master-slave(主-從)模式應用

  3. Redis支持數據的持久化,將內存中的數據保持在磁盤中,重啟的時候再次加載進行使用。

  4. Redis單個value的最大限制是1GB,memcache只能保存1MB數據。

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類型操作

  1. String是redis最基本的類型

  2. 該類型可以包含任何數據,包括jpg圖片或者序列化的對象

  3. 單個value最大上限是1G字節

  4. 如果只用string類型,redis是可以被看做加上持久性的memcache。

具體操作

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個步驟

  • 使用JedisConnectionFactory建立連接工廠

  • 創建RedisTemplate模板

  • 配置序列化器 RedisTemplate提供了以下幾種序列化器,我們可以根據項目的需求進行選擇。

從源碼看,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上添加注解

  • 創建RedisCacheManager

  • 自定義緩存的key

在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查詢緩存.

  1. 如果key不存在,查詢db,并將結果更新到緩存中。

  2. 如果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的時候,一定要加上”“(引號)才行。


Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
業司
教育資訊
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部