Jedis设计

Jedis作为推荐的java语言redis客户端,其抽象封装为三部分:

  1. 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjectFactory,JedisFactory
  2. 面向用户的redis操作封装:BinaryJedisCommands,JedisCommands,BinaryJedis,Jedis
  3. 面向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的设计分为以下几块:

  1. 对象池设计:Pool,ShardedJedisPool,ShardedJedisFactory
  2. 面向用户的操作封装:BinaryShardedJedis,BinaryShardedJedis
  3. 一致性哈希实现:Sharded

关于ShardedJedis设计,忽略了Jedis的设计细节,设计类图如下:


关于ShardedJedis类图设计,省略了对象池,以及Jedis设计的以下细节介绍:

类名 职责
Sharded

抽象了基于一致性哈希算法的划分设计,设计思路

  1. 基于hash算法划分redis服务器
  2. 保持每台Redis服务器的Jedis客户端
  3. 提供基于Key的划分方法;提供了ShardKeyTag实现
BinaryShardedJedis 同BinaryJedis类似,实现BinaryJedisCommands对外提供基于Byte[]的key,value操作
ShardedJedis 同Jedis类似,实现JedisCommands对外提供基于String的key,value操作

Sharded一致性哈希实现

shared一致性哈希采用以下方案:

  1. Redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)
  2. 将划分虚拟节点采用TreeMap存储
  3. 对每个Redis服务器的物理连接采用LinkedHashMap存储
  4. 对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点
sharded采用的hash算法:MD5 和 MurmurHash两种;默认采用64位的MurmurHash算法;有兴趣的可以研究下,MurmurHash是一种高效,低碰撞的hash算法;参考地址:

[redis] Jedis 与 ShardedJedis 设计的更多相关文章

  1. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  2. Redis实战之Redis + Jedis[转]

    http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报   目录(?)[-] ...

  3. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  4. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

  5. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...

  6. 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)

    有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...

  7. 征服 Redis + Jedis + Spring (三)—— 列表操作【转】

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...

  8. Redis 高可用架构设计(转载)

    转载自:https://mp.weixin.qq.com/s?__biz=MzA3NDcyMTQyNQ==&mid=2649263292&idx=1&sn=b170390684 ...

  9. springboot配置redis+jedis,支持基础redis,并实现jedis GEO地图功能

    Springboot配置redis+jedis,已在项目中测试并成功运行,支持基础redis操作,并通过jedis做了redis GEO地图的java实现,GEO支持存储地理位置信息来实现诸如附近的人 ...

随机推荐

  1. 【leetcode❤python】231. Power of Two

    #-*- coding: UTF-8 -*- class Solution(object):    def isPowerOfTwo(self, n):        if(n<=0):     ...

  2. Devexpress TreeList选择父级联动

    Treelist当显示复选框后,父级和子级的复选框没有关联,使用过程中很不便,如图所示 自己给treelist添加父子级联动 /// <summary> /// 初始化TreeList,父 ...

  3. chmod 无法修改磁盘文件的权限解释 (光盘文件就是只读的,修改不了的)

    我们知道root用户是linux执行权限最高的管理者用户,他可以进行任何的权限操作:然而我们的操作系统同样也考虑过这样的弊端,就是当我们使用者并不了解文件属性和重要性时会给予我们使用者提示: 举个例子 ...

  4. head标签掉到body里的问题

    HTML最开始的标签   <!DOCTYPE html>在其之前不能有任何的内容,否则head里的内容就会掉到body里,导致譬如网站的图标icon无法更新等的功能问题

  5. Change Or Set Report Object Property At Run Time In Oracle Forms Using Set_Report_Object_Property Command

    Sets the Report object property at run time in Oracle Forms of an report object. The following are t ...

  6. python中的类中属性元素加self.和不加self.的区别

    在类中,self只能在函数中使用,表示的是实例属性,就是每个实例可以设置不值,而不相互影响.如果在类级别使用没有self的属性,是类属性,一般作为全局变量来用的.事实上:就是一个是类属性 一个是对象属 ...

  7. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  8. Zeller公式推导及C#代码示例(待完善)

    Zeller公式用于计算给定日期是星期几. 该方法可以用数论知识进行证明. 假设给定日期Date为Year-Month-Day,求解该日期是星期几的问题实际上就是以之前某个确定星期几的日期作为参考点, ...

  9. DICOM标准相关资料

    由于需要阅读影像,对DICOM需要先熟悉起来.关于DICOM,找了一些资料,可以学习.如下: DICOM标准:http://dicom.nema.org/standard.html 中文 DICOM ...

  10. JPG 批量压缩、 PNG32、PNG24转PNG 透明批量压缩工具 【JPNG】 支持多级目录

    说在最前,压缩不一定是最好的,仅仅是为了方便自己工作需要.主要是手机端图片 算法说明:JPG压缩使用的是  adobe 的 JPGEncoder+ AIR的JPEGEncoderOptions (注 ...