Jedis哨兵模式如何实现主从的读写分离

这篇具有很好参考价值的文章主要介绍了Jedis哨兵模式如何实现主从的读写分离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:redis的主从和哨兵模式,在官方的功能模式下,从实例只有数据备份和作为主实例的备机作用,并不具备我们想象中的主实例负责写,从实例负责读的职责分工

实际项目中不会使用单独的主从复制的模式的吧,哨兵模式还有使用的项目,那哨兵模式下如何实现读写分离呢?

废话不多说直接上demo,顺便看下原生的jedis哨兵是不是真的不支持读写分离,这可不是我在瞎说:

jedis版本:

<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.10.2</version>
</dependency>

 我们使用jedis的JedisSentinelPool类来创建哨兵链接

Set<String> sentinels = new HashSet<>();
sentinels.add("192.168.84.1:16379");
sentinels.add("192.168.84.1:16380");
sentinels.add("192.168.84.1:16381");
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
// 永远返回的都是 Master 连接
Jedis master = pool.getResource();

 看下getResource()源码:

public Jedis getResource() {
        while(true) {
            Jedis jedis = (Jedis)super.getResource();
            jedis.setDataSource(this);
            HostAndPort master = this.currentHostMaster;
            HostAndPort connection = new HostAndPort(jedis.getClient().getHost(), jedis.getClient().getPort());
           // 是主实例的连接信息,才会返回jedis连接
            if (master.equals(connection)) {
                return jedis;
            }

            this.returnBrokenResource(jedis);
        }
    }

没骗你吧?

那如果我们想实现jedis哨兵模式的读写分离,要怎么做呢 ,来,直接上硬货:

package com.cjian.jedis;


import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author: cjian
 * @Date: 2023/7/13 13:49
 * @Des:
 */
public class SentinelDemo {
    public static void main(String[] args) {
        Set<String> sentinels = new HashSet<>();
        sentinels.add("192.168.84.1:16379");
        sentinels.add("192.168.84.1:16380");
        sentinels.add("192.168.84.1:16381");
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
        // 永远返回的都是 Master 连接
        Jedis master = pool.getResource();

        // 获取 Master 的地址信息
        HostAndPort hostAndPort = pool.getCurrentHostMaster();
        System.out.println("master = " + hostAndPort.getHost() + ":" + hostAndPort.getPort() + " " + master);

        testRWSeparation(master);
    }

    private static void testRWSeparation(Jedis master){
        // 构造我们自己的对象
        MyJedis myJedis = new MyJedis();
        myJedis.setMaster(master);

        // 解析主从信息,提取从节点信息
        Pattern pattern = Pattern.compile("^slave\\d+:ip=(.+),port=(\\d+),state=.+$");
        String[] infos = master.info("replication").split("(\\r\\n)|(\\n)");
        for (String info : infos) {
            Matcher matcher = pattern.matcher(info);
            if (matcher.find()) {
                Jedis slave = new Jedis(matcher.group(1), Integer.valueOf(matcher.group(2)));
                myJedis.addSlaves(slave);
            }
        }

        // 写入数据
        myJedis.set("name", "cjian");

        // 读取数据
        String result = myJedis.get("name");
        System.out.println("result = " + result);

        result = myJedis.get("name");
        System.out.println("result = " + result);
    }


    static class MyJedis {
        /**
         * 主节点
         */
        private Jedis master;
        /**
         * 从节点,可能会有多个
         */
        private List<Jedis> slaves = new ArrayList<>();

        public void setMaster(Jedis master) {
            this.master = master;
        }

        public void addSlaves(Jedis slave) {
            this.slaves.add(slave);
        }

        public String get(String key) {
            Jedis jedis = slaves.get((int) (Math.random() * slaves.size()));
            System.out.println(">> get:" + jedis);
            return jedis.get(key);
        }

        public void set(String key, String value) {
            master.set(key, value);
        }
    }
}

输出如下: 文章来源地址https://www.toymoban.com/news/detail-555654.html

14:36:09.426 [main] INFO  r.clients.jedis.JedisSentinelPool - Trying to find master from available Sentinels...
14:36:09.437 [main] DEBUG r.clients.jedis.JedisSentinelPool - Connecting to Sentinel 192.168.84.1:16379
14:36:09.557 [main] DEBUG r.clients.jedis.JedisSentinelPool - Found Redis master at 192.168.84.1:6381
14:36:09.558 [main] INFO  r.clients.jedis.JedisSentinelPool - Redis master running at 192.168.84.1:6381, starting Sentinel listeners...
14:36:09.765 [main] INFO  r.clients.jedis.JedisSentinelPool - Created JedisPool to master at 192.168.84.1:6381
master = 192.168.84.1:6381 redis.clients.jedis.Jedis@783e6358
>> get:redis.clients.jedis.Jedis@735f7ae5
result = cjian
>> get:redis.clients.jedis.Jedis@180bc464
result = cjian

到了这里,关于Jedis哨兵模式如何实现主从的读写分离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis主从哨兵模式

    IP 服务 用途 10.0.10.45 redis sentinel zookeeper uniquecode 主redis 10.0.10.43 redis sentinel zookeeper uniquecode 从reids-1 10.0.10.44 redis sentinel zookeeper uniquecode 从redis-2 redis主从哨兵分为两部分,redis主从和redis哨兵 redis主从主要负责提供redis服务 redis哨兵主要用来监控redis服务状态,并进行切换主从

    2024年02月11日
    浏览(46)
  • Redis 主从配置、哨兵、集群模式

    目录 Redis 主从复制  主从复制的作用: 主从复制流程: 搭建Redis 主从复制 安装 Redis 环境准备 修改内核参数 安装redis 创建redis工作目录 环境变量 定义systemd服务管理脚本 修改 Redis 配置文件(Master节点操作) 修改 Redis 配置文件(Slave节点操作) 验证主从效果 Redis 哨兵模式

    2024年02月12日
    浏览(56)
  • Redis三种模式——主从复制,哨兵模式,集群

    目录 一、主从复制  1.1主从复制的概念   1.2Redis主从复制作用  1.2.1数据冗余  1.2.2故障恢复   1.2.3负载均衡  1.2.4高可用基石  1.3Redis主从复制流程    1.4部署Redis 主从复制 1.4.1.环境部署  1.4.2.所有服务器都先关闭防火墙  1.4.3.所有服务器都安装Redis  1.4.4修改Master主节点

    2024年02月14日
    浏览(37)
  • Redis单机,主从,哨兵,集群四大模式

    Redis 单机模式是指 Redis 数据库在单个服务器上以独立的、单一的进程运行的模式。在这种模式下,Redis 不涉及数据分片或集群配置,所有的数据和操作都在一个实例中进行。以下是关于 Redis 单机模式的详细介绍: 单一实例: 在 Redis 单机模式中,只有一个 Redis 实例在一个服

    2024年02月13日
    浏览(41)
  • Redis(六)主从模式与哨兵机制

    配置一主二从集群 开启三个linux,并安装redis info replication 查询当前库的信息 replicaof 192.168.31.238 6379 重启redis服务,重新查看信息 主机: 从机信息 测试主机写,从机读 主机可读可写,但是多用于写 从机可读不可写 主机失联 从机依然可以获取数据 两个从机的角色并没有发生

    2024年02月06日
    浏览(76)
  • Redis 主从复制 + 哨兵模式 + Cluster 集群

    redis群集有三种模式: 分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建cluster群集 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡

    2024年02月09日
    浏览(38)
  • Redis篇之主从复制及哨兵模式

    主从复制: 是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), 数据的复制是单向的,只能由主节点复制到从节点(主节点以写为主、从节点只读)—— 读写分离。 默认情况下,每个Redis服务都是以

    2023年04月16日
    浏览(37)
  • redis复制和分区:主从复制、哨兵模式和集群模式

    在 Redis 中,复制和分区是用于数据冗余和性能扩展的关键特性。以下是主从复制、哨兵模式和集群模式的工作原理的简要概述: 主从复制 (Replication) 基本概念 :Redis 的主从复制功能允许多个 Redis 服务器具有相同的数据副本。这在读取操作的负载均衡、数据备份、灾难恢复等

    2024年01月20日
    浏览(42)
  • 【Redis】三种集群模式(主从复制、哨兵模式、Cluster)

    redis有三种集群模式,其中主从是最常见的模式。Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,主要作用就是监控主从集群,自动切换主备,完成集群故障转移。cluster 模式是redis官方提供的集群模

    2024年01月21日
    浏览(60)
  • Redis(主从复制、哨兵模式、集群)概述及部署

    目录 一、Redis高可用 二、redis持久化 2.1 持久化的功能 2.2 Redis 提供两种方式进行持久化 2.3 RDB 持久化 2.3.1 触发条件  2.3.2 执行流程 2.3.3 启动时加载 2.4 AOF持久化 2.5 执行流程 2.5.1 命令追加(append)  2.5.2 文件写入(write)和文件同步(sync) 2.5.3 文件重写(rewrite) 2.5.3.1 文件重写的

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包