標籤:class blog code http tar get
#==========================================================================================# => redis叢集管理器#==========================================================================================class CacheGroupManagerattr_reader :redis_groups# redis 叢集attr_reader :redis_group_keys# redis 叢集hash組def initialize(cache_addrs)@redis_groups = {}@redis_group_keys = []for addr in cache_addrscreate_cache_node(addr)end@redis_group_keys = @redis_groups.keys.sortend#==========================================================================================# => 建立節點#==========================================================================================def create_cache_node(addr)ip = addr.split(":")[0]port = addr.split(":")[1].to_iredis = Redis.new( :host=> ip, :port => port);# 建立虛擬節點for i in 0..2hash = HashCode.hash(addr + "#{i}")@redis_groups[hash] = redisendend#==========================================================================================# => 找到最近的cache點#==========================================================================================def find_near_cache(hash)start = find(@redis_group_keys, hash, 0, @redis_group_keys.size - 1)for i in [email protected]_group_keys.sizeif(@redis_group_keys[i] >= hash)return @redis_groups[@redis_group_keys[i]]endend# 如果找了一輪..都找不到..return @redis_groups[@redis_group_keys.first]end#==========================================================================================# => 折中找到開始搜尋點#==========================================================================================def find(keys, v, start, tail)mid = keys[start + tail / 2]if(tail - start == 1)return startendif(tail - start == 0)return startendif(mid > v)find(keys, v, start, tail / 2)elsif mid < vfind(keys, v, start + tail / 2, tail)else mid == vreturn start + tail / 2endend#==========================================================================================# => 通過key找到cache點#==========================================================================================def get_cache_from_key(key)hash = HashCode.hash(key)cache = find_near_cache(hash)return cache;end#==========================================================================================# => 自增一個key#==========================================================================================def incr(key)cache = get_cache_from_key(key)return cache.incr(key)end#==========================================================================================# => 設定一個value#==========================================================================================def set(key, value)cache = get_cache_from_key(key)return cache.set(key, value)end#==========================================================================================# => 擷取一個vaue#==========================================================================================def get(key)cache = get_cache_from_key(key)return cache.get(key)endend
最近大概的研究了一下一致性hash.
簡單點描述就是
key做一次hash
cache也做hash
操作key的時候,根據key的hash找到cache.
以key的hash為起點.找到下一個cache的hash,那個cache就是這個資料要儲存的地方
具體參考
http://www.nowamagic.net/librarys/veda/detail/1336