`
yychao
  • 浏览: 97669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jedis 与 ShardedJedis 设计

阅读更多

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算法;参考地址:


 

  • 大小: 52.9 KB
  • 大小: 43.2 KB
分享到:
评论
5 楼 LUCKYZHOUSTAR 2015-12-10  
牛逼,楼主怎么学习的呢
4 楼 bluky999 2014-11-07  
bluky999 写道
opentan 写道
zhangfeikr 写道
使用ShardedJedis,一台挂掉后,还可以正常运行吗?数据怎么自动都缓存到另一到?

用sentinel做ha,当master当掉后sentinel自动选举新的slave,并publish一条切换master消息,jedis监听消息并完成连接池的重连



如果是连接master,jedis可以监听到变化后,自动切换到新的master么??? 貌似没看到类似的API 哦


貌似是 JedisSentinelPool 有这个功能? 
3 楼 bluky999 2014-11-07  
opentan 写道
zhangfeikr 写道
使用ShardedJedis,一台挂掉后,还可以正常运行吗?数据怎么自动都缓存到另一到?

用sentinel做ha,当master当掉后sentinel自动选举新的slave,并publish一条切换master消息,jedis监听消息并完成连接池的重连



如果是连接master,jedis可以监听到变化后,自动切换到新的master么??? 貌似没看到类似的API 哦
2 楼 opentan 2014-10-22  
zhangfeikr 写道
使用ShardedJedis,一台挂掉后,还可以正常运行吗?数据怎么自动都缓存到另一到?

用sentinel做ha,当master当掉后sentinel自动选举新的slave,并publish一条切换master消息,jedis监听消息并完成连接池的重连
1 楼 zhangfeikr 2014-06-22  
使用ShardedJedis,一台挂掉后,还可以正常运行吗?数据怎么自动都缓存到另一到?

相关推荐

    jedis-2.9.0.jar

    jedis-2.9.0.jar jedis-2.9.0 jar 包,不包含源码,源码下载地址: http://download.csdn.net/download/tan3739/9993938 测试代码: 导入依赖包: commons-lang-2.5.jar commons-pool2-2.4.2.jar jedis-2.9.0 jar ...

    jedis2.8 与 spring3.2 整合

    关于Redis 3.0.7 的集群部署 及 jedis2.8 与 spring3.2 整合的测试笔记 配套小程序

    jedis jedis.jar

    jedis jar包; 版本:2.0 2.1

    Spring-4.1.7、jedis-2.8.0、spring-data-redis-1.6.2

    而且发现Jedis和ShardedJedis的方法非常多,覆盖了Redis几乎所有操作,但是没有注释,也没有异常处理,也没有资源回收,所以我就对这两个类进行了再次封装,对照着Redis官网的中文API加上了中文注释,并对接口方法...

    jedis依赖jar包

    jedis依赖jar包, jedis-2.7.0.jar

    jedis相关jar包

    jedis相关jar包:commons-pool2-2.3.jar、jedis-2.7.0.jar

    jedis-2.9.0-API文档-中文版.zip

    赠送jar包:jedis-2.9.0.jar; 赠送原API文档:jedis-2.9.0-javadoc.jar; 赠送源代码:jedis-2.9.0-sources.jar; 包含翻译后的API文档:jedis-2.9.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId...

    jedis-2.8.0-API文档-中文版.zip

    赠送jar包:jedis-2.8.0.jar; 赠送原API文档:jedis-2.8.0-javadoc.jar; 赠送源代码:jedis-2.8.0-sources.jar; 赠送Maven依赖信息文件:jedis-2.8.0.pom; 包含翻译后的API文档:jedis-2.8.0-javadoc-API文档-...

    jedis 和 common-pool

    jedis和对应的pool,jedis是2.7版 pool是2.3版,使用的时候 解压使用里面的jar包

    jedis-2.6.2.zip

    此资源为Java连接redis的工具jar,Jedis 版本为2.62; 有两个地方需要注意下;jedis 3.0新版本废弃了旧回收资源方法; 废弃方法为:JedisPool.returnResource(Jedis);回收资源 Jedis 3.0版本新回收资源: Jedis.close();...

    各种版本的redis+Jedis驱动包

    Redis Windows32位+64位安装包,Linux压缩包, Redis图形操作管理软件,Jedis

    jedis-2.5.1.jar

    Jedis 是 Redis 官方首选的 Java 客户端开发包。 实例方法: ? 1 import redis.clients.jedis.* ? 1 2 3 Jedis jedis = new Jedis("localhost"); jedis.set("foo", "bar"); String value = jedis.get("foo"); 支持...

    jedis-test.7z jedis 简单测试 项目工程

    jedis-test.7z jedis 简单测试 项目工程 lib 目录包含了依赖包: commons-lang-2.5.jar commons-pool2-2.4.2.jar jedis-2.9.0.jar 另: * Jedis 的源码工程(导入 eclipse 可直接运行): ...

    jedis源码 (学习jedis)

    jedis源码 (学习jedis必备,附带测试用例)

    jedis-jedis-2.7.2

    jedis-jedis-2.7.2缓存技术应用

    使用redisson替代jedis

    使用redisson替代jedis中的的对应方法,以及对应的redis的命令在这三方中对应查询及操作,

    Jedis2.1.0源码与Jar包

    Jedis2.1.0源码与Jar包,实现在Java中操作Redis服务器!

    jedis分片选择库,jedis动态过滤无效服务器

    1 jedis分片支持数据库 2 动态的将有故障的服务器过滤掉 使用实例 static ShardedJedisPool shareJedisPool; static List<JedisShardInfo> jdsInfoList =new ArrayList(); static{ JedisPoolConfig config =new ...

    jedis-4.3.1

    要开始使用 Jedis,首先将其作为依赖项添加到您的 Java 项目中。如果使用 Maven: <groupId>redis.clients <artifactId>jedis <version>4.3.0 对于许多应用程序,最好使用连接池。实例化 Jedis 连接池: Jedis...

    jedis 2.8.1

    jedis jedis

Global site tag (gtag.js) - Google Analytics