上一篇中介绍了ShardedJedis的基本使用方法以及演示了一个简单的例子,在这一篇中我们来介绍了ShardedJedis的原理。

1.ShardedJedis内部实现

首先我们来看一下ShardedJedis的一个继承关系

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnwAAAEOCAIAAACcjV1WAAAgAElEQVR4nO3d61cT574H8PM/naJYMYZcSELu95AJiKQoF4UAKlcVFAgXdWsL5AJo7e4RhmC1rbbHJ6tr7bXXOj3d+6y1l5dja2v3rtXjanfLtmtvgdfnxYQQJhcDTGYmk2/W50UY5nky8zy/PN88QOu/VRysBAAAAB78m+BXAAAAUCIQugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAAT8Qbuj14FOyB2cEjzwdKZQcPwRdPEDNRh25TgxU4x8migNkpBSgVoQYNJEzUoXuk3gKc42olFfxGoNBQKkINGkiYqEO38ZAZOMfVSir4jUChoVSEGjSQMFGH7jt1JuAcVyup4DcChYZSEWrQQMJEHbr+WiNwjquVVPAbgUJDqQg1aCBhog7dBp8BOMfVSir4jUChoVSEGjSQMFGH7mFKn83RVufg7YHR/xm/8PjyhceXR/88dvajgaOtzhxNgMHVSorZkTweSqW5pX6UJqPku+AfXgb/8HL03rfDi/eaW+oFv3dhBw0kTNShW+/VZ3Rqum380cXrL2/cfnX3k98+/+S3z2+/unv95Y3xR5dOTbdlawUMrlZSzI7kFbpUTl8JjX7x4v0Hv338/dqdv63f+dv6x9+vvf/gt9EvXpy+EhL89gUcNJAwUYfuoZrqdCenjl148u7NlU9uv7rLcnPlkwtP3j05dSxjQx7UebqukshZj64wnddfXiZXB9idb/dFuVpJCz07da3BZbJ0ubUgg7mNYR+IkOVgwKMTyfVwdTv5nFzQUhm4HBr740+3nq598td1lltP18b++NPA5VBed+TpusrFvGxrZHKc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" alt="" />

看完了图,那么我们一步一步跟着我们的代码调用来看,以我们最简单的 ShardedJedis.get(key)方法为例:

  public String get(String key) {
Jedis j = getShard(key);
return j.get(key);
}

这边有调用一个getShard 方法,参数为我们传入的key,然后返回一个普通的jedis对象,那么这个getShard是用来做什么的呢,大家可能已经猜到了,这个方法就是会根据我们传入的key做一致性哈希判断,然后返回key落到的那个redis实例上的一个redis连接,不同的key返回的redis连接可能是不同的。

进入getShard 方法,你会发现这个实现是在Sharded类中实现的(看上面的类图可以发现顶层的Sharded类),代码如下:

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());
} public S getShardInfo(String key) {
return getShardInfo(SafeEncoder.encode(getKeyTag(key)));
}

上面的方法是层层调用的关系,在这边不细说,我们主要看下第二个方法(getShardInfo(byte[] key))实现(上面的nodes变量是一个TreeMap 类型, algo Hashing类型,即key分片所使用的hash算法,这个在前一篇有简单说过),那么这段代码的含义我们大概成猜出来了,

  1. 就是在一个TreeMap中取出大于等于key之后的部分视图SortMap
  2. 在SortMap取得第一个键值对的值,然后返回一个 S 对象,
  3. 然后根据这个S 对象,去resources(resources = new LinkedHashMap<ShardInfo<R>, R>())中get一个R对象

那么这个S R对象各自代表什么呢?看下面的代码

public class Sharded<R, S extends ShardInfo<R>>
public class BinaryShardedJedis extends Sharded<Jedis, JedisShardInfo> implements
BinaryJedisCommands

可以得出  S = JedisShardInfo, R = Jedis 对象,即在TreeMap存储了服务器划分的虚拟节点的信息,LinkedHashMap中存储了服务器的物理连接。

JedisShardInfo具体信息如下:里面包含了jedis服务器的一些信息,最重要的是它的父类中有一个weight字段,作为本jedis服务器的权值。

ok,那我们了解了实际上就是根据jedis服务器的信息去获取一个jedis的连接,返回给上层调用。

我们可以梳理下这个逻辑:

  1. 当我们使用ShardedJedis去查一个key时,首先它会把这个key进行一个hash算法
  2. 根据这个hash值然后去treeMap中,查出这个key落在哪个实例中,并返回redis实例对应的具体信息
  3. 根据这个redis的实例信息,到一个保存jedis链接和实例信息对应关系的LinkedHashMap中找到这个jedis连接
  4. 最终返回jedis连接,执行对象的命令操作(到这步后实际上和单机操作一样了)

那么我们的nodes 服务器虚拟节点和resources 服务器物理连接是什么时候初始化的呢,接下来继续看

2.redis虚拟节点(nodes)和物理连接(resources) 初始化

我们继续看Sharded的构造方法

public Sharded(List<S> shards, Hashing algo) {
this.algo = algo;
initialize(shards);
} public Sharded(List<S> shards, Hashing algo, Pattern tagPattern) {
this.algo = algo;
this.tagPattern = tagPattern;
initialize(shards);
}

这边有一个initialize方法,就是用来对虚拟节点和物理连接进行初始化的,看其实现

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());
}
}

具体细节就不说了,根据上面的,我们就知道是在这边进行了初始化,将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重),保存在TreeMap中,

然后把每台服务器节点的信息和物理连接以键值对保存LinkedHashMap中。

然后通过一系列的查找,发现Sharded的构造方法其实是在我们 jedisPool.getResource() 时就完成的

  //初始化ShardedJedisPool
List<JedisShardInfo> infoList = Arrays.asList(shardInfo1, shardInfo2, shardInfo3);
ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);
ShardedJedis jedis = jedisPool.getResource();

纳尼? 每次jedisPool.getResource() 才初始化?那会不会造成很慢呢,其实不用担心,其底层是使用了commons.pool来进行连接池的一些操作,会根据我们配置的连接池参数来生成对应的连接并保存,其中的细节很复杂,博主没有继续深究,实现其实和数据库连接池是一致的。

3.总结

ShardedJedis分布式具体的的实现思路:

  • redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)

  • 将划分虚拟节点采用TreeMap存储

  • 对每个redis服务器的物理连接采用LinkedHashMap存储

  • 对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点

  • sharded采用的hash算法:MD5 和 MurmurHash两种;默认采用64位的MurmurHash算法;

好了,大概的实现如上面所说的,都是图可能会有点乱,大家如果有什么问题或者发现了什么错误,please tell me!

Jedis下的ShardedJedis(分布式)使用方法(二)的更多相关文章

  1. Jedis下的ShardedJedis(分布式)使用方法(一)

    原来项目中有用到Redis用作缓存服务,刚开始时只用一台Redis就能够满足服务,随着项目的慢慢进行,发现一台满足不了现有的项目需求,因为Redis操作都是原子性这样的特性,造成有时同时读写缓存造成查 ...

  2. Jedis下的ShardedJedis

    jedis客户端操作redis主要三种模式:单台模式.分片模式(ShardedJedis).集群模式(BinaryJedisCluster) ShardedJedis是通过一致性哈希来实现分布式缓存的 ...

  3. linux系统下php安装mbstring扩展的二种方法

    .执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...

  4. was集群下基于接口分布式架构和开发经验谈

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/luozhonghua2014/article/details/34084935    某b项目是我首 ...

  5. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  6. 在Linux下配置多线路ADSL的方法

    经过一段时间的观察,证明运行良好,现把设置过程及方法总结一下,欢迎指正.此文档可以说明双ADSL及多ADSL增加线路的配置过程. 实验环境: 操作系统: RedHat7.3 两条ADSL,长期观察线路 ...

  7. Android抓包方法(二)之Tcpdump命令+Wireshark

    Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...

  8. PHP-Fcgi下PHP的执行时间设置方法

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误,原来PHP-Fcgi下的设置执行时间与isapi的不同     一般情况下设置PHP ...

  9. hadoop2.2.0+hive-0.10.0完全分布式安装方法

    hadoop+hive-0.10.0完全分布式安装方法 1.jdk版本:jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/j ...

随机推荐

  1. DevExpress.XtraGrid.Views 设置指定行的背景颜色 .

    如需要将指定行的背景设置颜色,可参考以下示例 1.事件:CustomDrawCell 2.示例: private void gridView1_CustomDrawCell(object sender ...

  2. 编写简单的C/S聊天程序

    找了点资料看了下,于是自己动手做了一个练习一下, 主要用到TServerSocket和TClientSocket这个控件. 客户端: var Form1: TForm1; NewTime:string ...

  3. java.lang.RuntimeException: Fail to connect to camera service问题

    做音视频录制功能的真机调试的时候出现这个问题 错误意思为无法连接到相机服务 可能由两种情况导致 1.配置清单文件没有设置相应的权限 <uses-permission android:name=& ...

  4. 【读书笔记】iOS-对象初始化

    一,分配对象. 分配是一个样的对象诞生的过程.最美好的时刻,是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置.向某个类发送alloc消息的结果,就是为该类分配一块足够大的内存,以存放该内的 ...

  5. Android源码分析之AsyncTask

    AsyncTask相信从事Android开发的同学都不陌生,基本都应该用到了,和以前一样我们还是先来看看此类的summary.AsyncTask 可以确保更合理.容易的使用UI线程.这个类是设计用来执 ...

  6. iOS 学习 - 1.代理传值

    代理的目的是改变或传递控制链.允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针.可以减少框架复杂度.
另外一点,代理可以理解为java中的回调监听机制的一种类似 优点:1.避免子类化带 ...

  7. iOS提醒用户进入设置界面进行重新授权通知定位等功能

    iOS 8及以上版本最不为人知的一个特点是与应用设置的深层链接,用户可以根据APP的需要授权启用位置.通知.联系人.相机.日历以及健康等设置. 大多数应用程序仅仅是弹出一个包含操作指令的警示窗口,如“ ...

  8. iOS开发笔记4:HTTP网络通信及网络编程

    这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...

  9. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  10. IOS之UI--小实例项目--添加商品和商品名

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...