天天看點

redis 學習筆記(5)-Spring與Jedis的內建

使用步驟:

一、pom添加依賴項

其它Spring必備元件,比如Core,Beans之類,大家自行添加吧

觀察一下:

redis 學習筆記(5)-Spring與Jedis的內建

jedis、jredis等常用java的redis client已經支援了,不知道以後會不會內建Redisson,spring-data-redis提供了一個非常有用的類:StringRedisTemplate

redis 學習筆記(5)-Spring與Jedis的內建

對于大多數緩存應用場景而言,字元串是最常用的緩存項,用StringRedisTemplate可以輕松應付。

二、spring配置

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

View Code

提示:上面配置中的端口為sentinel的端口,而非redis-server的端口。

注:26-28行,經試驗,如果修改了預設端口,這裡必須明細指定hostName及port,否則運作後,無法正确讀寫緩存,參考下面的配置:

(2016-4-2更新:最新1.6.4版的spring-data-redis 已經修正了這個問題,無需再指定端口和hostname)

其中hostName為目前master的IP,port為redis-server的運作端口(非sentinel端口),此外還要設定usePool為false,由于sentinel可能會自行切換master節點,如果不清楚目前的master節點是哪台機器,可以用前面提到的指令./redis-cli -p <sentinal端口号> sentinel masters檢視,或者用java代碼輸出,參考下面的代碼:

另外<property name="usePool" value="false"/> 這裡的value值如果改成true,經實際測試,發現偶爾會報如下錯誤(如果報錯,換成false通常就可以了):

redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'SET'

其它注意事項:

配置檔案中的sentinels屬性的Set 中的節點,并非一定要在同一個master下,也可以是歸屬于多個master,即:如果這裡配置了10個node資訊,其中1-3歸屬于master1,剩下的4-10屬于master2,這也是允許的。

這樣調用時,通過StringRedisTemplate.getConnectionFactory().getSentinelConnection().masters()可以傳回一個master的清單,然後代碼中根據需要,向某一個需要的master寫入緩存.

三、單元測試

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

運作一下,行雲流水般的輸出:

...

資訊: Created JedisPool to master at 10.6.144.***:7030

http://yjmyzz.cnblogs.com/

---------------

A

B

C

SHA - 上海虹橋

PVG - 浦東

PEK - 北京

注意紅色标出部分,從eclipse控制台的輸出,還能看出目前的master是哪台伺服器

這裡再補充一點小技巧:如果想周遊所有master及slave可以參考以下代碼

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

輸出類似下面的結果:

master => 172.20.16.191:6379

slaves of 172.20.16.191:6379 => 172.20.16.192:6379

注:這裡輸出的slaves清單,經實際測試,發現隻是根據redis server端的配置呆闆的傳回slave node清單,不管這些node是死是活,換句話說,就算某個slave已經down掉,這裡依然會傳回。

三、POJO對象的緩存

Spring提供的StringRedisTemplate隻能對String操作,大多數情況下已經夠用,但如果真需要向redis中存放POJO對象也不難,我們可以參考StringRedisTemplate的源碼,擴充出ObjectRedisTemplate

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

然後就可以這樣用了:

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

其中SampleBean的定義如下:

redis 學習筆記(5)-Spring與Jedis的內建
redis 學習筆記(5)-Spring與Jedis的內建

注:由于不是标準的String類型,是以在redis控制台,用./redis-cli get myBean是看不到緩存内容的,隻能得到nil的輸出,不要誤以為set沒成功!通過代碼是可以正常get到緩存值的。 

另外關于POJO對象的緩存,還有二個注意事項:

a) POJO類必須要有預設的無參構造函數,否則反序列化時會報錯

b) ObjectRedisTemplate<T>中的T不能是接口,比如 DomainModelA繼承自接口 IModelA,使用ObjectRedisTemplate時,要寫成ObjectRedisTemplate<DomainModelA>而不是ObjectRedisTemplate<IModelA>,否則反序列化時也會出錯