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