[redis] Jedis 与 ShardedJedis 设计
Jedis设计
Jedis作为推荐的java语言redis客户端,其抽象封装为三部分:
- 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjectFactory,JedisFactory
- 面向用户的redis操作封装:BinaryJedisCommands,JedisCommands,BinaryJedis,Jedis
- 面向redis服务器的操作封装:Commands,Client,BinaryClient,Connection,Protocol
其类设计图如下:

关于common-pool的相关内容,可以参见:http://macrochen.iteye.com/blog/320077
其他类的设计作用如下:
| 类名 | 职责 |
| Pool | 抽象Jedis对象池操作;并委托给操作给GenericObjectPool |
| JedisPool | 实现Pool并提供JedisFactory工厂 |
| JedisFactory | 实现BasePoolableObjectFactory,提供创建,销毁Jedis方法 |
| BinaryJedisCommands | 抽象面向客户端操作的Redis命令;key,value都为序列化后的byte数组 |
| JedisCommands | 抽象面向客户端操作的Redis命令;提供String类型的key,value |
| BinaryJedis | 实现BinaryJedisCommands接口,并将实际操作委托给Client |
| Jedis | 实现JedisCommands接口,并将操作委托给Client |
| Commands | 抽象Redis操作接口,提供String类型的key,value操作;被Jedis调用 |
| Connection | 抽象了Redis连接;包括host,port,pass,socket,inputstream,outputstream,protocol 完成与Redis服务器的通信 |
| Protocol | 抽象了Redis协议处理 |
| BinaryClient | 继承Connection类,封装了基于Byte[]的key,value操作 |
| Client | 继承BinaryClient同时实现了Commands,对上层提供基于String类型的操作 |
ShardedJedis实现分析
ShardedJedis是基于一致性哈希算法实现的分布式Redis集群客户端;ShardedJedis的设计分为以下几块:
- 对象池设计:Pool,ShardedJedisPool,ShardedJedisFactory
- 面向用户的操作封装:BinaryShardedJedis,BinaryShardedJedis
- 一致性哈希实现:Sharded
关于ShardedJedis设计,忽略了Jedis的设计细节,设计类图如下:

关于ShardedJedis类图设计,省略了对象池,以及Jedis设计的以下细节介绍:
| 类名 | 职责 |
| Sharded |
抽象了基于一致性哈希算法的划分设计,设计思路
|
| BinaryShardedJedis | 同BinaryJedis类似,实现BinaryJedisCommands对外提供基于Byte[]的key,value操作 |
| ShardedJedis | 同Jedis类似,实现JedisCommands对外提供基于String的key,value操作 |
Sharded一致性哈希实现
shared一致性哈希采用以下方案:
- Redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)
- 将划分虚拟节点采用TreeMap存储
- 对每个Redis服务器的物理连接采用LinkedHashMap存储
- 对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点
[redis] Jedis 与 ShardedJedis 设计的更多相关文章
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
- Redis实战之Redis + Jedis[转]
http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] ...
- Redis实战之征服 Redis + Jedis + Spring (一)
Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...
- Redis实战之征服 Redis + Jedis + Spring (二)
不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...
- 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...
- 征服 Redis + Jedis + Spring (三)—— 列表操作【转】
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...
- Redis 高可用架构设计(转载)
转载自:https://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=2649263292&idx=1&sn=b170390684 ...
- springboot配置redis+jedis,支持基础redis,并实现jedis GEO地图功能
Springboot配置redis+jedis,已在项目中测试并成功运行,支持基础redis操作,并通过jedis做了redis GEO地图的java实现,GEO支持存储地理位置信息来实现诸如附近的人 ...
随机推荐
- Margin and Padding in Windows Forms Controls
https://msdn.microsoft.com/en-us/library/ms229627.aspx Margin and Padding Precise placement of contr ...
- Oracle ——————建表、select、视图
--建表 -- 关键字 : create -- 用法 : /* create table table_name ( lie1_name 数据类型 是否为空, lie2_name 数据类型 是否为空, ...
- 部署PDA程序的时候存储不足的解决办法
通常Windows Mobile的存储空间分为程序内存和存储内存,默认都比较小,当程序比较大的时候可能无法正常部署到设备上面,针对此问题可采用如下办法解决:1.通过VS修改,工具--选项--设备--选 ...
- CUBRID学习笔记 33 net事务 cubrid教程示例
conn.BeginTransaction(); string sql = "create table t(idx integer)"; using (CUBRIDCommand ...
- python中的is、==和cmp()比较字符串
python 中的is.==和cmp(),比较字符串 经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 Python 确不是这样子地.所以作为慢慢要转换 ...
- Codeforces Round #199 (Div. 2)
A.Xenia and Divisors 题意:给定N个数,每个数的取值范围为1-7,N是3的倍数,判定是否能够恰好将N个数分成若干三元组,使得一个组中的元素a,b,c满足 a < b < ...
- mysql概要(九)字符集和校对集
1.mysql 字符集有细致设置: 2.mysql字符处理机制是:数据库和客户端之间存在一个字符集转换器(后文简称转换器)将客户端字符编码(必须告诉服务端的)转换成一种中间编码的数据(可自定义的但保证 ...
- web设计经验<二>设计华丽的用户体验的6个热门技巧
你是否曾经下载了一个应用,却发现它“很难使用”?对于大多数智能手机用户来说,答案是肯定的. 有趣的是,每四个手机应用中就有一个应用在下载后被“打入冷宫”. 如果一个应用能够吸引一个人下载并且打开它,但 ...
- Vnc viewer与windows之间的复制粘贴
用VNC连接到Linux之后,最纠结的问题就是无法复制粘贴.其实很简单,在Linux里面,打开一个终端,然后输入命令: vncconfig 之后,会弹出一个窗口 不要关闭那个小窗口 之后,就可以愉快的 ...
- 机器学习如何选择模型 & 机器学习与数据挖掘区别 & 深度学习科普
今天看到这篇文章里面提到如何选择模型,觉得非常好,单独写在这里. 更多的机器学习实战可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6159187.html 另 ...