ruby redis的集群管理器
#==========================================================================================
# => 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的集群管理器的更多相关文章
- Spark的集群管理器
上篇文章谈到Driver节点和Executor节点,但是如果想要运行Driver节点和Executor节点,就不能不说spark的集群管理器.spark的集群管理器大致有三种,一种是自带的standa ...
- Spark集群管理器介绍
Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...
- redis cluster集群管理工具redis-trib.rb命令小结-运维笔记
redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单.便捷.实用的操作工具.redis-trib.rb ...
- Fleet(集群管理器)
工作原理 fleet 是通过systemd来控制你的集群的,控制的任务被称之为unit(单元),控制的命令是fleetctl unit运行方式 unit的运行方式有两种: standard globa ...
- Kubernetes TensorFlow 默认 特定 集群管理器
Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...
- Kubernetes TensorFlow 默认 特定 集群管理器 虚拟化技术
Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...
- Redis分布式集群几点说道
原文地址:http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html Redis分布式集群几点说道 Redis数据量日益 ...
- 【Redis】Redis分布式集群几点说道
Redis数据量日益增大,使用的公司越来越多,不仅用于做缓存,同时趋向于存储这一块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片 ...
- redis搭建集群并用TreeSoft管理
前言:redis作为一款高效的NOSQL数据库已经深入贯彻和落实到我们的日常开发代码中,作为缓存.时间控制.数据仓库.队列等使用方法层出不穷,简直是开写代码.居家旅行之必备良药.曾经,我们的项目都是单 ...
随机推荐
- SpringBoot学习笔记(7)-----CORS支持解决跨域问题
在实际应用开发中,跨域是一个比较常见的问题,解决方法可以用jsonp,frame,cors等, 这里示例的是SpringBoot对CORS的支持的三种实现方式 第一种:配置一种全局的支持,这种方式需要 ...
- 操作Map
///操作Map Map<String,Object> userInfo = new HashMap(); userInfo.put("uid", adUserEnti ...
- [arc076f]Exhausted? - 贪心
题意: 给你m个椅子可以坐人,初始坐标为正整数1~m,有n个人,每个人希望坐的位置$\leq L_i$或者$\geq R_i$,可以添加若干个椅子在任意的实数位置,求最少要添加多少椅子使得所有人都有位 ...
- 【mysql】新增、修改、删除、查询 语法讲义
一.DML - 数据操作语言 INSERT - 实现数据表数据的新增 UPDATE - 实现数据表数据的修改 DELETE - 实现数据表数据的删除 二.INSERT 语法: insert into ...
- 你可能需要了解下Laravel集合
前言 集合通过 Illuminate\Support\Collection 进行实例,Laravel的内核大部分的参数传递都用到了集合,但这并不代表集合就是好的.Laravel作为快捷并优雅的开发框架 ...
- [SDOI2008]郁闷的小J(分块)
[SDOI2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危 ...
- mysql索引的使用及优化方法
数据库高级管理及优化 MySQL性能优化 优化MySQL数据库是数据库管理员和数据库开发人员的必备技能.优化MySQL,一方面是找出系统的瓶颈,提高MySQL数据库整体的性能:另一方面是合理设计结构和 ...
- POJ——T 3041 Asteroids
http://poj.org/problem?id=3041 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23565 ...
- 完毕乔布斯的梦想:一个免费wifi共享的乌托邦
早在2007年推出iPhone时,乔布斯就提出这种如果:商业区与居民区的wifi路由器全民开放,实现与路人共享网络之便.能够想象,那算是一个wifi共享的乌托邦. 数年过去了,乔布斯的梦想依然没能全然 ...
- vim 插件之vundle
vundle这个插件主要是用来插件管理的.它可以根据你配置的插件地址,自动下载.更新.删除插件,非常的好用 地址 https://github.com/gmarik/vundle 然后你在 .vim下 ...