#==========================================================================================
# => 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. php获取当前月份的前(后)几个月

    //获取当前月份的前一月 function GetMonth($sign) { //得到系统的年月 $tmp_date=date("Ym"); //切割出年份 $tmp_year= ...

  2. 《Unix环境高级编程》读书笔记 第3章-文件I/O

    1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...

  3. 3ds Max制作厨房贴图和纹理实例

    来源:CG游 使用软件:3ds Max 软件下载:www.xy3dsmax.com/xiazai.html 大家好,欢迎大家来阅读这个教程.这个教程是讲解我前不久制作的一个场景效果图.因为场景已经制作 ...

  4. webkit Safari的样式库

    1,webkit Box模型 CSS定义:-webkit-border-bottom-left-radius: radius; CSS定义:-webkit-border-top-left-radius ...

  5. Visual Studio中C++工程的环境配置方法

    在Visual Studio的C++工程设置 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录. 2.添加文件引用的lib静态库路径:工程---属性- ...

  6. React diff机制(介绍虚拟DOM的机制)

    https://segmentfault.com/a/1190000004003055

  7. AC自动机笔记

    AC自动机 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  8. 51nod 1325 两棵树的问题(最大权闭合子图)

    首先如果点权全都为正,就可以直接选所有的点. 活在梦里.. 考虑枚举一个点\(i\),作为我们选择的集合中的一个点. 然后我们把另一个点\(j\)选入集合的时候必须把两棵树中\(i\)和\(j\)路径 ...

  9. springboot --> web 应用开发-CORS 支持

    一.Web 开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS 等等 CORS 与 JSONP 相比 1. JSONP 只能实现 GET 请求,而 CORS 支持所有类型的 HTT ...

  10. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...