ShardedJedis部分源码 redis分布式直连同步方式
2016-11-15 14:21
211 查看
ShardedJedis redis分布式直连同步
==============================================================
Sharded类中4个属性,2个重要方法:
4个属性
1.new JedisShardInfo()时调用,算是初始化
nodes和resources结合使用,找到虚拟节点对应的真实节点
2.get()/set()方法时调用,获取存取数据到的具体Jedis
实现一致性哈希旋转概念(找到最近的节点)
ShardedJedis.java
-----------------------------------------------------
BinaryShardedJedis.java
-----------------------------------------------------
TreeMap、treeMap.tailMap()、SortedMap示例:
==============================================================
Sharded类中4个属性,2个重要方法:
4个属性
public static final int DEFAULT_WEIGHT = 1;//权重 private final Hashing algo;//哈希 private TreeMap<Long, S> nodes;//虚拟节点 private final Map<ShardInfo<R>, R> resources = new LinkedHashMap<ShardInfo<R>, R>();//真实节点两个重要方法
1.new JedisShardInfo()时调用,算是初始化
private void initialize(List<S> shards) { nodes = new TreeMap<Long, S>(); for (int i = 0; i != shards.size(); ++i) { final S shardInfo = shards.get(i); 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); } resources.put(shardInfo, shardInfo.createResource());//shardInfo.createResource() = new Jedis() } }160为虚拟节点基数,shardInfo.getWeight()权重越大,虚拟节点数越多,越容易存取到该节点
nodes和resources结合使用,找到虚拟节点对应的真实节点
2.get()/set()方法时调用,获取存取数据到的具体Jedis
public R getShard(String key) { return resources.get(getShardInfo(key)); } public S getShardInfo(byte[] key) { SortedMap<Long, S> tail = nodes.tailMap(algo.hash(key)); if (tail.isEmpty()) { return nodes.get(nodes.firstKey()); } return tail.get(tail.firstKey()); }TreeMap、nodes.tailMap()、SortedMap
实现一致性哈希旋转概念(找到最近的节点)
ShardedJedis.java
-----------------------------------------------------
public String set(String key, String value) { Jedis j = getShard(key); return j.set(key, value); } public String get(String key) { Jedis j = getShard(key); return j.get(key); } ......-----------------------------------------------------
BinaryShardedJedis.java
-----------------------------------------------------
public String set(byte[] key, byte[] value) { Jedis j = getShard(key); return j.set(key, value); } public byte[] get(byte[] key) { Jedis j = getShard(key); return j.get(key); } ......-----------------------------------------------------
TreeMap、treeMap.tailMap()、SortedMap示例:
public static void main(String[] args) { // creating maps TreeMap<Integer, String> treemap = new TreeMap<Integer, String>(); // populating tree map treemap.put(2, "two"); treemap.put(1, "one"); treemap.put(3, "three"); treemap.put(6, "six"); treemap.put(5, "five"); SortedMap<Integer, String> treemapincl = treemap.tailMap(3);//该方法调用返回此映射,其键大于或等于fromKey(这里是3)的值 System.out.println("Tail map values: " + treemapincl); // 执行结果: Tail map values: {3=three, 5=five, 6=six} }
相关文章推荐
- 一种数据展示方式,UI设计新颖,供大家参考(源码部分) (demo已经上传)
- Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他
- 第二部分:源码发布服务器同步到N台WEB服务器
- Unity3D 大型游戏 最后一站 源码 部分重点 英雄玩家同步移动(14)
- Redis分布式锁天津快三开奖网源码出售的正确实现方式
- duBand源码分析-数据自动同步部分
- Java核心技术学习---多线程,锁,同步,条件对象部分应用源码
- ShardedJedisPipeline 源码分析
- 一种数据展示方式,UI设计新颖,供大家参考(源码部分) (demo已经上传)
- 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)
- Windows Programming系列 用户方式中线程的同步
- SVN的Local方式:个人源码管理的好办法 (zz)
- 通告: 已经上传部分程序及源码,有兴趣的朋友请到:http://download.csdn.net/user/WallesCai 查看
- sql server中order by部分使用方式
- 在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs
- 部分QQ源码
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- 一个老病毒的部分源码加注释
- delphi 游戏菜单部分源码
- MFC串口操作(异步方式)源码