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