ShardedJedis的分片原理
ShardedJedisPool xml配置:
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0">
<bean class="redis.clients.jedis.JedisPoolConfig"></bean>
</constructor-arg>
<constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="192.168.233.8"/>
<constructor-arg name="port" value="6379"/>
</bean>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="192.168.233.8"/>
<constructor-arg name="port" value="6381"/>
</bean>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="192.168.233.8"/>
<constructor-arg name="port" value="6382"/>
</bean>
</list>
</constructor-arg>
</bean>
xml配置对应的构造方法:
public class ShardedJedisPool extends Pool<ShardedJedis> {
public ShardedJedisPool(final GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards) {
this(poolConfig, shards, Hashing.MURMUR_HASH);
}
}
ShardedJedisPool使用示例:
ShardedJedisPool pool = ctx.getBean(ShardedJedisPool.class);
ShardedJedis jedis = pool.getResource();
String zhang = jedis.get("zhang");
jedis.close();
ShardedJedisPool.getResource 的调用栈:
代码分析:
//类 redis.clients.util.Sharded<R, S extends ShardInfo<R>>
private final Map<ShardInfo<R>, R> resources = new LinkedHashMap<ShardInfo<R>, R>(); private void initialize(List<S> shards) {
nodes = new TreeMap<Long, S>();
//shards是xml中配置的redis.clients.jedis.JedisShardInfo的list
for (int i = 0; i != shards.size(); ++i) {
final S shardInfo = shards.get(i);
//没有为JedisShardInfo设置name,所以执行if分支,weight默认为1
//取 SHARD-0-NODE-0 ~ SHARD-0-NODE-159 哈希值
//取 SHARD-1-NODE-0 ~ SHARD-1-NODE-159 哈希值
//取 SHARD-2-NODE-0 ~ SHARD-2-NODE-159 哈希值
//把(哈希值->JedisShardInfo)键值对放入nodes中
if (shardInfo.getName() == null) for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo);
}
else for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash(shardInfo.getName() + "*" + shardInfo.getWeight() + n), shardInfo);
}
//添加到map中,键为JedisShardInfo,值为Jedis
resources.put(shardInfo, shardInfo.createResource());
}
}
JedisShardInfo.createResource:
//省略其他代码
public class JedisShardInfo extends ShardInfo<Jedis> {
@Override
public Jedis createResource() {
return new Jedis(this);
}
}
存取一个键时,根据键获取一个JedisShardInfo,以get为例:
public S getShardInfo(byte[] key) {
//nodes是TreeMap,由红黑树实现,是按键值排好序的map,默认为升序
//假定 algo.hash(key) 的值为10086,该行代码是取出键大于10086的所有键值对
SortedMap<Long, S> tail = nodes.tailMap(algo.hash(key));
//如果不存在,则取第一个键值对的JedisShardInfo
if (tail.isEmpty()) {
return nodes.get(nodes.firstKey());
}
//如果存在这样的键值对,则返回第一个键值对中的JedisShardInfo
return tail.get(tail.firstKey());
}
Sharded类中有2个map,TreeMap<Long, S> nodes和Map<ShardInfo<R>, R> resources,
运行时具体是:TreeMap<Long, JedisShardInfo>和Map<JedisShardInfo, Jedis>。
分析以上代码可知,首先计算出 "SHARD-i-NODE-n" 的哈希值,预先生成一颗红黑树,即填充nodes。
当存取键值对时,计算键的哈希值,然后从红黑树上摘下比该值大的第一个节点上的JedisShardInfo,随后从resources取出Jedis。
假定有红黑树如下:
ShardedJedis的分片原理的更多相关文章
- 进阶的Redis之哈希分片原理与集群实战
前面介绍了<进阶的Redis之数据持久化RDB与AOF>和<进阶的Redis之Sentinel原理及实战>,这次来了解下Redis的集群功能,以及其中哈希分片原理. 集群分片模 ...
- ElasticSearch高可用集群环境搭建和分片原理
1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...
- Mongodb 分片原理
1.主从mongodb 模式 类似,MySQL的主从配置 参照:https://blog.csdn.net/liusong0605/article/details/11551699 mongoDB有 ...
- MongoDB分片原理篇
MongoDB分片 为什么需要Sharded cluster? MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『可扩展性』,通过json文档来实现灵活模式,通过复制集来保证高可用, ...
- MongoDB 分片的原理、搭建、应用
一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...
- MongoDB 分片的原理、搭建、应用 !
MongoDB 分片的原理.搭建.应用 一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...
- MongoDB 分片的原理、搭建、应用 (转)
一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...
- Jedis分片连接池
[http://blog.csdn.net/lang_man_xing/article/details/38405269] 一下内容来自网络,但是很多细节没有写出来,所以我经过自己琢磨,终于找到原 ...
- mongodb 学习笔记 09 -- shard分片
概述 shard 分片 就是 把不同的数据分在不同的server 模型 当中: 用户对mongodb的操作都是向mongs请求的 configsvr 用于保存,某条数据保存在哪个sha ...
随机推荐
- windows tomcat web应用以及eclipse console乱码解决方法
在windows下,如果vm文件名为UTF-8格式,则显示乱码(velocity写出的不乱码): 改回GBK,则不再乱码.
- JavaScript 实现表格隔行变色
JavaScript 实现表格隔行变色 版权声明:未经授权,严禁分享! 构建界面 界面HTML代码 <style> #data,th,td{ border: 1px solid #aaaa ...
- 20145305 《网络对抗》注入Shellcode并执行&Return-to-libc 攻击实验
注入Shellcode并执行 实践指导书 实践过程及结果截图 准备一段Shellcode 我这次实践和老师用的是同一个 设置环境 构造要注入的payload 我决定将返回地址改为0xffffd3a0 ...
- 20145322何志威《网络对抗技术》Exp6 信息搜集技术
20145322何志威<网络对抗技术>Exp6 信息搜集技术 实验内容 掌握信息搜集的最基础技能: (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发 ...
- object Add(object Before, object After, object Count, object Type);
[表达式] .Add(Before, After, Count, Type) [表达式] 一个代表 Sheets 对象的变量. Before指定工作表的对象,新建的工作表将置于此工作表之前. Afte ...
- 【基础知识】ActiveMQ基本原理
“来,根据你的了解说下 ActiveMQ 是什么.” “这个简单,ActiveMQ 是一个 MOM,具体来说是一个实现了 JMS 规范的系统间远程通信的消息代理.它……” “等等,先解释下什么是 MO ...
- [BZOJ2208][Jsoi2010]连通数 暴力枚举
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...
- trigger自动执行事件
html <button>点击文字变红</button> <p>trigger出发点击事件</p> js $('button').click(funct ...
- [IDEA插件] - 一个不错的插件
今天看到微信平台一篇推送IDEA插件的文章继而下载了个插件看了下. 名字叫做codehelper.generator codehelper.generator http://plugins.jetbr ...
- Git教程摘录
http://download.csdn.net/download/lianghesgdmv/9893973 教程doc下载 备用-- 链接:http://pan.baidu.com/s/1gfu2 ...