您的位置:首页 > 其它

Jedis源码解析(ShardedJedis)

2016-03-22 20:26 225 查看

1 Sharding机制

sharding机制:即通常所说的“分片”,允许数据存放在不同的物理机器上, 以适应数据量过大的场景,克服单台机器内存或者磁盘空间的限制。Redis并不支持服务器端分片(redis3.0开始支持了),不过我们可以使用Jedis提供的API来实现客户端的分片,通过“一致性hash”算法,使得数据离散地存放在不同的服务器上面。

2 ShardedJedis类的结构



3 ShardedJedis类解析

先上代码:



(1)初始化ShardedJedis

目前在jedis 2.2.1中提供4个初始化方法,其Hashing参数可以指定hash算法,SharderJedis默认采用64位的MurmurHash算法(了炸天的算法),但是也提供了MD5算法



继续深入SharderJedis的构造方法调用了Sharded类的构造方法,在Sharded方法中:

1 定义了一个TreeMap ,TreeMap 用于存储虚拟节点(在初始化方法中,将每台服务器节点采用hash算法划分为160个(默认的,DEFAULT_WEIGHT)虚拟节点(当然也可以配置划分权重)

2 定义一个LinkedHashMap,用于存储每一个Redis服务器的物理连接



其中shardInfo的createResource就是物理连接信息



(2)使用ShardedJedis操作数据的过程

怎么进行数据的操作呢?其一般过程就是根据key获取key对应的Jedis信息,然后再进行数据的操作!



那么是如何根据key确定对应的Jedis信息的呢?

在上面我们知道resources(LinkedHashMap)用于存储每一个Redis服务器的物理连接,其key为shardedInfo对象,value为Jedis实例,因此只需要根据shardedInfo对象就可以找到jedis实例。那么怎么获取对应key的shardedInfo对象呢?



做法是这样的:

1)对于key采用与初始化时同样的hash(MurmurHash或者MD5)算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点;

2)当key的hash值大于虚拟节点hash值得最大值时(也就是tail为空),取第一个虚拟节点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: