博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ShardedJedis的分片原理
阅读量:4958 次
发布时间:2019-06-12

本文共 2800 字,大约阅读时间需要 9 分钟。

ShardedJedisPool xml配置:

xml配置对应的构造方法:

public class ShardedJedisPool extends Pool
{ public ShardedJedisPool(final GenericObjectPoolConfig poolConfig, List
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
>private final Map
, R> resources = new LinkedHashMap
, R>();private void initialize(List
shards) { nodes = new TreeMap
();  //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
{ @Override public Jedis createResource() { return new Jedis(this); }}

存取一个键时,根据键获取一个JedisShardInfo,以get为例:

public S getShardInfo(byte[] key) {   //nodes是TreeMap,由红黑树实现,是按键值排好序的map,默认为升序   //假定 algo.hash(key) 的值为10086,该行代码是取出键大于10086的所有键值对      SortedMap
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。

假定有红黑树如下:

转载于:https://www.cnblogs.com/allenwas3/p/7852274.html

你可能感兴趣的文章
JSON对象和字符串之间的相互转换
查看>>
1629 B君的圆锥
查看>>
[转]我国古代求解最大公约数的方法-更相减损术
查看>>
使用Keras编写GAN的入门
查看>>
数组排序 (选择排序、冒泡排序、插入排序、希尔排序)
查看>>
musql 单表查询
查看>>
【Git】标签管理
查看>>
[HNOI2017]大佬
查看>>
『重构--改善既有代码的设计』读书笔记----Hide Delegate
查看>>
1、libgdx简单介绍
查看>>
Swift iOS tableView static cell动态计算高度
查看>>
Windows Phone开发(24):启动器与选择器之发送短信 转:http://blog.csdn.net/tcjiaan/article/details/7404643...
查看>>
工厂模式(headfirst)笔记
查看>>
Hibernate初探之单表映射——创建持久化类
查看>>
File类
查看>>
有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位...
查看>>
mui框架通讯录检索
查看>>
正则表达式全集
查看>>
vuex中的dispatch和commit
查看>>
mybatis实战教程二:多对一关联查询(一对多)
查看>>