ruby redis的叢集管理器

來源:互聯網
上載者:User

標籤: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

 






相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.