Jedis源码分析(四)-JedisSentinel与ShardedJedis介绍「建议收藏」

Jedis源码分析(四)-JedisSentinel与ShardedJedis介绍

大家好,又见面了,我是你们的朋友全栈君。

Jedis源码分析共有四个章节,以下为各章链接:

  1. Jedis源码分析(一)-Jedis介绍
  2. Jedis源码分析(二)-Jedis类结构及实现
  3. Jedis源码分析(三)- JedisCluster类结构及实现
  4. Jedis源码分析(四)-JedisSentinel与ShardedJedis介绍

1 JedisSentinel

JedisSentinel常用方式有两种:

1.使用哨兵单节点拿到主节点,从节点的信息

//通过哨兵节点的信息新建Jedis实例,然后拿到Master节点的信息
Jedis j = new Jedis(sentinel);
List<Map<String, String>> masters = j.sentinelMasters();
//拿到master的address,**MASTER_NAME**
List<String> masterHostAndPort = j.sentinelGetMasterAddrByName(**MASTER_NAME**);
HostAndPort masterFromSentinel = new HostAndPort(masterHostAndPort.get(0),Integer.parseInt(masterHostAndPort.get(1)));
assertEquals(master, masterFromSentinel);
//通过哨兵节点,拿到从节点的信息
List<Map<String, String>> slaves = j.sentinelSlaves(**MASTER_NAME**);

2.使用哨兵节点对象池

Set<String> sentinels = new HashSet<String>();
sentinels.add(new HostAndPort("localhost", 65432).toString());
sentinels.add(new HostAndPort("localhost", 65431).toString());
JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels);
pool.destroy();

JedisSentinelPool的结构清晰,内部使用对象池存放一个个sentinel实例。图2-12和2-13分别为JedisSentinelPool的类结构和初始化流程。在使用时,我们先根据,host,port等信息,初始化一个Jedis实例,然后可以通过sentinelMasters()sentinelGetMasterAddrByName(MASTER_NAME)sentinelSlaves(MASTER_NAME)等方法拿到这个哨兵节点监听的MASTER节点信息或对应的SLAVE节点信息。

图片描述

​ 图1.1 JedisSentinelPool 的类结构

图片描述

​ 图1.2 JedisSentinelPool 的初始化流程

2 ShardedJedis

下文为构建Jedis分片的方法(单节点与对象池的模式),

  1. 单节点模式
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(2);
//其中一个分片
JedisShardInfo shard1 = new JedisShardInfo(redis1);
shards.add(shard1);
//另一个分片
JedisShardInfo shard2 = new JedisShardInfo(redis2);
shards.add(shard2);
@SuppressWarnings("resource")
//新建ShardedJedis实例
ShardedJedis shardedJedis = new ShardedJedis(shards);
shardedJedis.set("a", "bar");
//通过key可以查看存储在哪个jedis
JedisShardInfo ak = shardedJedis.getShardInfo("a");
assertEquals(shard2, ak);
  1. 对象池模式
ShardedJedisPool pool = new ShardedJedisPool(new GenericObjectPoolConfig(), shards);
ShardedJedis jedis = pool.getResource();
jedis.set("foo", "bar");
assertEquals("bar", jedis.get("foo"));

图片描述
图2-1 ShardedJedis的类结构

图片描述

​ 图2-2 ShardedJedis的初始化流程

​ 图2-1为ShardedJedis的类结构(其内部保存一个对象池,与常规的JedisPool的不同之处在于,内部的PooledObjectFactory实现不同),分片信息保存在基类Sharded中,Sharded保存了3个重要变量:

  1. nodes是一个TreeMap,保存了每个分片节点和对应的hash值。
  2. algo是计算hash值的函数,默认是MurmurHash,可替换。
  3. resources是一个LinkedHashMap,存放着JedisShardinfo和一个Jedis实例的对应关系。

​ 图2-2为 ShardedJedis的初始化流程,通过传入待分片的节点信息,初始化好上述3个变量。在使用时,先根据key计算出hash值,在nodes中找到对应的分片信息,再在resources中找到对应的Jedis实例,然后通过这个Jedis实例才操作redis节点。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107443.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深度学习(五)学习率的调节

    深度学习(五)学习率的调节   学习率对于深度学习是一个重要的超参数,它控制着基于损失梯度调整神经网络权值的速度,大多数优化算法(SGD、RMSprop、Adam)对其都有所涉及。学习率越小,损失梯度下降的速度越慢,收敛的时间更长,如公式所示:new_weight=existing_weight—learning_rate*gradient(新权值=当前权值–学习率×梯度)    如果学习…

    2022年5月20日
    85
  • python下载安装教程[通俗易懂]

    python下载安装教程[通俗易懂]python3.7.3下载步骤第一步:进入Python官网[https://www.python.org/](https://www.python.org/)第二步:点击downloads进入下载界面选择你想要的下载的版本。这里我选择的是Python3.7.3第三步:新建一个标签,输入网址:[https://python123.io/download](https://python123.io/d…

    2022年6月14日
    39
  • pycharm配置tensorflow环境_tensorflow安装

    pycharm配置tensorflow环境_tensorflow安装1、Mac上安装tensorflow首先需要配置python环境,虽然Mac自带python2.7,但是做开发还是不够的,需要安装更高的版本,我这里安装的是python3.6.4,系统自带的版本最好不要去修改。2、python安装参考自博客:http://blog.csdn.net/fancylovejava/article/details/39140373因为我安装的是pyt

    2022年8月28日
    3
  • java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]

    java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]转载转载自:http://www.tuicool.com/articles/nMNVVjJava自带的数据加密类MessageDigest(MD5或SHA加密)说明:在网站中,为了保护网站会员的用户名和密码等隐私信息,所以我们在用户注册时就直接进行MD5方式或其他方式进行加密,即使是数据库管理员也不能查看该会员的密码等信息,在数据库中查看密码效果如:8e830882f03b2cb84d1a6…

    2022年7月17日
    12
  • java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」

    java responsebody_SpringBoot ResponseBody返回值处理的实现「建议收藏」1.springbootresponsebody返回值中null值处理@postmapping(path=”/test”,produces=mediatype.application_json_value)publicobjecttest(){jsonobjectjsonobject=newjsonobject();jsonobject.put(“test”,”tes…

    2022年5月28日
    38
  • 常用电容分类_电容电阻

    常用电容分类_电容电阻一、瓷介电容器(CC)1.结构用陶瓷材料作介质,在陶瓷表面涂覆一层金属(银)薄膜,再经高温烧结后作为电极而成。瓷介电容器又分1类电介质(NPO、CCG));2类电介质(X7R、2X1)和3类电介质(Y5V、2F4)瓷介电容器。2.特点1类瓷介电容器具有温度系数小、稳定性高、损耗低、耐压高等优点。最大容量不超过1000pF,常用的有CC1、…

    2022年8月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号