使用步驟:
一、pom添加依賴項
其它Spring必備元件,比如Core,Beans之類,大家自行添加吧
觀察一下:
jedis、jredis等常用java的redis client已經支援了,不知道以後會不會內建Redisson,spring-data-redis提供了一個非常有用的類:StringRedisTemplate
對于大多數緩存應用場景而言,字元串是最常用的緩存項,用StringRedisTemplate可以輕松應付。
二、spring配置
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寫入緩存.
三、單元測試
運作一下,行雲流水般的輸出:
...
資訊: Created JedisPool to master at 10.6.144.***:7030
http://yjmyzz.cnblogs.com/
---------------
A
B
C
SHA - 上海虹橋
PVG - 浦東
PEK - 北京
注意紅色标出部分,從eclipse控制台的輸出,還能看出目前的master是哪台伺服器
這裡再補充一點小技巧:如果想周遊所有master及slave可以參考以下代碼
輸出類似下面的結果:
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
然後就可以這樣用了:
其中SampleBean的定義如下:
注:由于不是标準的String類型,是以在redis控制台,用./redis-cli get myBean是看不到緩存内容的,隻能得到nil的輸出,不要誤以為set沒成功!通過代碼是可以正常get到緩存值的。
另外關于POJO對象的緩存,還有二個注意事項:
a) POJO類必須要有預設的無參構造函數,否則反序列化時會報錯
b) ObjectRedisTemplate<T>中的T不能是接口,比如 DomainModelA繼承自接口 IModelA,使用ObjectRedisTemplate時,要寫成ObjectRedisTemplate<DomainModelA>而不是ObjectRedisTemplate<IModelA>,否則反序列化時也會出錯