ruby redis的集群管理器

来源:互联网 发布:研究所20升级数据 编辑:程序博客网 时间:2024/06/07 12:16
#==========================================================================================# => 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 start...@redis_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

 






0 0
原创粉丝点击