簡單說明下,寫此文章算是對自己近一段工作的總結,希望能對你有點幫助,同時也是自己的一點小積累。
一.為什么選擇redis
在項目中使用redis做為緩存,還沒有使用memcache,考慮因素主要有兩點:
1.redis豐富的數據結構,其hash,list,set以及功能豐富的String的支持,對于實際項目中的使用有很大的幫忙。(可參考官網redis.io)
2.redis單點的性能也非常高效(利用項目中的數據測試優(yōu)于memcache).
基于以上考慮,因此選用了redis來做為緩存應用。
二.分布式緩存的架構設計
1.架構設計
由于redis是單點,項目中需要使用,必須自己實現分布式。基本架構圖如下所示:
2.分布式實現
通過key做一致性哈希,實現key對應redis結點的分布。
一致性哈希的實現:
hash值計算:通過支持MD5與MurmurHash兩種計算方式,默認是采用MurmurHash,高效的hash計算。
一致性的實現:通過java的TreeMap來模擬環(huán)狀結構,實現均勻分布
3.client的選擇
對于jedis修改的主要是分區(qū)模塊的修改,使其支持了跟據BufferKey進行分區(qū),跟據不同的redis結點信息,可以初始化不同的ShardInfo,同時也修改了JedisPool的底層實現,使其連接pool池支持跟據key,value的構造方法,跟據不同ShardInfos,創(chuàng)建不同的jedis連接客戶端,達到分區(qū)的效果,供應用層調用
4.模塊的說明
臟數據處理模塊,處理失敗執(zhí)行的緩存操作。
屏蔽監(jiān)控模塊,對于jedis操作的異常監(jiān)控,當某結點出現異??煽刂苧edis結點的切除等操作。
整個分布式模塊通過hornetq,來切除異常redis結點。對于新結點的增加,也可以通過reload方法實現增加。(此模塊對于新增結點也可以很方便實現)
對于以上分布式架構的實現滿足了項目的需求。另外使用中對于一些比較重要用途的緩存數據可以單獨設置一些redis結點,設定特定的優(yōu)先級。另外對于緩存接口的設計,也可以跟據需求,實現基本接口與一些特殊邏輯接口。對于cas相關操作,以及一些事物操作可以通過其watch機制來實現。(參考 redis事物介紹 http://www.linuxidc.com/Linux/2012-11/74362.htm)