#==========================================================================================
# => redis集群管理器
#==========================================================================================
class CacheGroupManager attr_reader :redis_groups # redis 集群
attr_reader :redis_group_keys # redis 集群hash组 def initialize(cache_addrs) @redis_groups = {}
@redis_group_keys = [] for addr in cache_addrs
create_cache_node(addr)
end @redis_group_keys = @redis_groups.keys.sort end #==========================================================================================
# => 创建节点
#==========================================================================================
def create_cache_node(addr)
ip = addr.split(":")[0]
port = addr.split(":")[1].to_i
redis = Redis.new( :host=> ip, :port => port); # 创建虚拟节点
for i in 0..2
hash = HashCode.hash(addr + "#{i}")
@redis_groups[hash] = redis
end end #==========================================================================================
# => 找到近期的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.size
if(@redis_group_keys[i] >= hash)
return @redis_groups[@redis_group_keys[i]]
end
end
# 假设找了一轮..都找不到..
return @redis_groups[@redis_group_keys.first]
end #==========================================================================================
# => 折中找到開始搜寻点
#==========================================================================================
def find(keys, v, start, tail)
mid = keys[start + tail / 2]
if(tail - start == 1)
return start
end
if(tail - start == 0)
return start
end
if(mid > v)
find(keys, v, start, tail / 2)
elsif mid < v
find(keys, v, start + tail / 2, tail)
else mid == v
return start + tail / 2
end
end #==========================================================================================
# => 通过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)
end end

近期大概的研究了一下一致性hash.

简单点描写叙述就是

key做一次hash

cache也做hash

操作key的时候,依据key的hash找到cache.

以key的hash为起点.找到下一个cache的hash,那个cache就是这个数据要储存的地方

详细參考

http://www.nowamagic.net/librarys/veda/detail/1336

ruby redis的集群管理器的更多相关文章

  1. Spark的集群管理器

    上篇文章谈到Driver节点和Executor节点,但是如果想要运行Driver节点和Executor节点,就不能不说spark的集群管理器.spark的集群管理器大致有三种,一种是自带的standa ...

  2. Spark集群管理器介绍

    Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...

  3. redis cluster集群管理工具redis-trib.rb命令小结-运维笔记

    redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单.便捷.实用的操作工具.redis-trib.rb ...

  4. Fleet(集群管理器)

    工作原理 fleet 是通过systemd来控制你的集群的,控制的任务被称之为unit(单元),控制的命令是fleetctl unit运行方式 unit的运行方式有两种: standard globa ...

  5. Kubernetes TensorFlow 默认 特定 集群管理器

    Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...

  6. Kubernetes TensorFlow 默认 特定 集群管理器 虚拟化技术

    Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...

  7. Redis分布式集群几点说道

    原文地址:http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html  Redis分布式集群几点说道 Redis数据量日益 ...

  8. 【Redis】Redis分布式集群几点说道

    Redis数据量日益增大,使用的公司越来越多,不仅用于做缓存,同时趋向于存储这一块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片 ...

  9. redis搭建集群并用TreeSoft管理

    前言:redis作为一款高效的NOSQL数据库已经深入贯彻和落实到我们的日常开发代码中,作为缓存.时间控制.数据仓库.队列等使用方法层出不穷,简直是开写代码.居家旅行之必备良药.曾经,我们的项目都是单 ...

随机推荐

  1. POJ 1664 放苹果【DFS】

    题意:给出n个苹果,m个盘子,问有多少种不同的苹果放置方法 可以把它抽象为把一个数n,拆分成a1,a2,a3,---,am,使得它们的和为n, 话说这一题是学习的ppt里面的,它的思路就是搜索 搜索条 ...

  2. Mojo C++ System API

    This document is a subset of the Mojo documentation. Contents Overview Scoped, Typed Handles Message ...

  3. 路飞学城Python-Day2

    13.变量的定义规范 变量的含义:变量就是定义之后还能发生改变,可以重新赋值的量;变量的定义规范:名字不能随便起,声明一个变量,name = "123"[变量 = 值]变量定义规则 ...

  4. 【BZOJ2006】【NOI2010】超级钢琴

    题意: Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...

  5. keepalived + nginx 实现高可用

    原理 nginx 可以实现负载均衡,但 nginx 自身存在单点故障的问题,这时候最先想到的就是 keepalived,可以解决单点故障的问题 由于没有使用 lvs,所以这里 nginx 之间不存在负 ...

  6. 2016 10 27 考试 dp 向量 乱搞

    目录 20161027考试 T1: T2: T3: 20161027考试 考试时间 7:50 AM to 11:15 AM 题目 考试包 据说这是一套比较正常的考卷,,,嗯,,或许吧, 而且,,整个小 ...

  7. Jquery-基础知识点

    jquery 包含的功能 1.HTML元素选取.操作 2.CSS操作 3.HTML事件函数 4.Javascript特效和动画 5.HTML DOM遍历和修改 6.AJAX 7. Untilities ...

  8. POJ——T 1422 Air Raid

    http://poj.org/problem?id=1422 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8579   A ...

  9. 深入C++ new/delete,malloc/free解析

    深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...

  10. mysql-组合查询

    一.组合查询 mysql允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回.这些组合查询通常称为并(union)或复合查询(compound query). 有两种情况需要使用组 ...