广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现Redis哨兵的示例代码
  • 586
分享到

Java实现Redis哨兵的示例代码

2024-04-02 19:04:59 586人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

前言: 本文将采用文字+代码的方式,讲解Redis版哨兵的实现,所有代码都将写在一个类中,每个属性和方法都会结合文字加以说明。 1. 哨兵(Sentinel)主要功能如下: 1、不时

前言:

本文将采用文字+代码的方式,讲解Redis版哨兵的实现,所有代码都将写在一个类中,每个属性和方法都会结合文字加以说明。

1. 哨兵(Sentinel)主要功能如下:

1、不时的监控redis节点是否良好运行,如果节点不可达就会对节点进行下线标识

2、如果被标识的是主节点,哨兵就会选举一个redis从(slave)节点成为新的主节点继续对外提供读写服务, 进而实现自动故障转移,保证系统的高可用

3、在redis主节点 和 从节点 进行切换后,主节点配置文件master_redis.conf、从节点配置文件slave_redis.conf都要发生改变。

2. 准备工作:

  • Redis集群推荐一主两从,共三个节点。
  • jedis-2.9.0.jar 客户端框架

3. 代码实现

JavaSentinel.java

package com.middleware.redis.sentinels;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.*;


public class JavaSentinel {

    // 主节点ip:端口    127.0.0.1:6379
    static String masterAddress = "127.0.0.1:6379";
    // 所有 slave
    static final Vector<String> slaveRedisServers = new Vector<String>();
    // 坏掉的实例
    static final Vector<String> badRedisServers = new Vector<String>();

    // 连接池对象
    static JedisPool jedisPool ;

    // 连接池配置信息对象
    private static JedisPoolConfig config = new JedisPoolConfig();

    
    static {

        // 最大连接数10
        config.setMaxTotal(10);
        //最大空闲连接数5
        config.setMaxIdle(5);

    }

    
    public Jedis newJedisInstance() {
        return jedisPool.getResource() ;
    }

    volatile static JavaSentinel javaSentinel;

    

    public static synchronized JavaSentinel getInstance(boolean isOpenSentinel){

        // 是否开启java哨兵
        if(isOpenSentinel){

            // 定时任务
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    // 检测 master是否可以
                    checkMaster();
                    // 更新slave列表
                    updateSlaves();
                    // 检测坏掉的实例是否恢复正常
                    checkBadServer();

                }
            }, 1000, 3000);
        }

        if(null == javaSentinel){

            
            String[] serverInfo = masterAddress.split(":");
            String masterHost = serverInfo[0] ;
            int masterPort = Integer.parseInt(serverInfo[1]) ;
            jedisPool = new JedisPool(config, masterHost, masterPort, 100000);

            //初始化当前类对象
            javaSentinel = new JavaSentinel();
        }

        return javaSentinel;

    }


    
    private static void checkMaster() {
        // 主从切换
        // 检查状态
        System.out.println("检查master状态:" + masterAddress);
        String masterHost = masterAddress.split(":")[0];
        int masterPort = Integer.parseInt(masterAddress.split(":")[1]);
        try {
            Jedis jedis = new Jedis(masterHost, masterPort);
            jedis.ping();
            jedis.close();
        } catch (Exception e) {
            // master挂掉啦
            badRedisServers.add(masterAddress);
            // 切换master
            changeMaster();
        }
    }

    
    private static void changeMaster() {
        Iterator<String> iterator = slaveRedisServers.iterator();
        while (iterator.hasNext()) {
            String slaveAddress = iterator.next();
            try {
                String slaveHost = slaveAddress.split(":")[0];
                int slavePort = Integer.parseInt(slaveAddress.split(":")[1]);
                Jedis jedis = new Jedis(slaveHost, slavePort);

                
                jedis.ping();

                
                jedis.slaveofNoOne();
                jedis.close();
                masterAddress = slaveAddress;
                System.out.println("产生新的master:" + masterAddress);
                break;
            } catch (Exception e) {
                badRedisServers.add(slaveAddress);
            } finally {
                iterator.remove();
            }
        }

        // 所有slave切到新的master
        for (String slave : slaveRedisServers) {
            String slaveHost = slave.split(":")[0];
            int slavePort = Integer.parseInt(slave.split(":")[1]);
            Jedis jedis = new Jedis(slaveHost, slavePort);
            jedis.slaveof(masterAddress.split(":")[0], Integer.parseInt(masterAddress.split(":")[1]));
            jedis.close();
        }
    }

    
    private static void updateSlaves() {
        // 获取所有slave
        try {
            String masterHost = masterAddress.split(":")[0];
            int masterPort = Integer.parseInt(masterAddress.split(":")[1]);
            Jedis jedis = new Jedis(masterHost, masterPort);
            String info_replication = jedis.info("replication");
            // 解析info replication
            String[] lines = info_replication.split("\r\n");
            int slaveCount = Integer.parseInt(lines[2].split(":")[1]);
            if (slaveCount > 0) {
                slaveRedisServers.clear();
                for (int i = 0; i < slaveCount; i++) {
                    String host = lines[3 + i].split(",")[0].split("=")[1];
                    String port = lines[3 + i].split(",")[1].split("=")[1];
                    slaveRedisServers.add(host + ":" + port);
                }
            }
            System.out.println("更新slave列表:" + Arrays.toString(slaveRedisServers.toArray(new String[] {})));
            jedis.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("更新slave失败:" + e.getMessage());
        }
    }


    
    private static void checkBadServer() {
        // 获取所有slave
        Iterator<String> iterator = badRedisServers.iterator();
        while (iterator.hasNext()) {
            String bad = iterator.next();
            try {
                String badHost = bad.split(":")[0];
                int badPort = Integer.parseInt(bad.split(":")[1]);
                Jedis badServer = new Jedis(badHost, badPort);
                badServer.ping();

                // 如果ping没有问题,则挂在当前的master
                badServer.slaveof(masterAddress.split(":")[0], Integer.parseInt(masterAddress.split(":")[1]));
                badServer.close();

                slaveRedisServers.add(bad);
                iterator.remove();
                System.out.println(bad + " 恢复正常,当前master:" + masterAddress);
            } catch (Exception e) {
            }
        }
    }
}

到此这篇关于Java实现Redis哨兵的示例代码的文章就介绍到这了,更多相关Java Redis哨兵内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现Redis哨兵的示例代码

本文链接: https://www.lsjlt.com/news/153354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现Redis哨兵的示例代码
    前言: 本文将采用文字+代码的方式,讲解redis版哨兵的实现,所有代码都将写在一个类中,每个属性和方法都会结合文字加以说明。 1. 哨兵(Sentinel)主要功能如下: 1、不时...
    99+
    2022-11-13
  • Redis中哨兵模式的示例分析
    小编给大家分享一下Redis中哨兵模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主从切换技术的方法是:当主服务器宕...
    99+
    2022-10-18
  • SpringbootRedis 哨兵模式的实现示例
    目录Redis配置redis.conf配置sentinel.conf配置Springboot整合测试模拟redis宕机Redis配置 redis.conf配置 由于服务器资源有限,我...
    99+
    2022-11-12
  • Redis 哨兵集群的实现
    目录1、Sentinel 哨兵2、Redis 主从分离一、配置Master二、配置Slave  1、在配置文件中配置从服务  2、在服务启动后设置  3、总结3、Sentinel 哨...
    99+
    2022-11-12
  • 基于Docker实现Redis主从+哨兵搭建的示例实践
    目录1.拉取镜像2. 编写主 从配置文件2.1 创建/home/redis/redis_conf目录:2.2 编写主配置文件2.3 编写从配置文件2.4  编写从配置文件3...
    99+
    2022-11-13
  • k8s部署redis哨兵的实现
    目录一、准备redis镜像二、准备k8s yml—redis-sentinel.yml三、查看redis哨兵信息四、连接redis哨兵一、准备redis镜像 dockerfile FROM redis:6.0...
    99+
    2022-07-01
    k8s部署redis哨兵 k8s redis哨兵
  • SpringBoot+Redis哨兵模式的实现
    最近学习到了Redis的哨兵模式,光看视频还不行,需要自己动手实现一遍才能加深映像,特此记录。 由于没有真实的服务器可以供我操作,所以在虚拟机上启动了3个redis服务,分别占用70...
    99+
    2022-11-13
  • Nginx代理Redis哨兵主从配置的实现
    目录一、环境二、配置2.1、方案一(推荐)2.2、方案二2.3、方案三一、环境 Nginx版本:1.21.6Center7.5及以上或Mas OS搭建Redis哨兵主从模式Springboot集成Redis哨兵主从模式 提示:Nginx必须...
    99+
    2022-09-23
  • Redis哨兵模式高可用的示例分析
    这篇文章将为大家详细讲解有关Redis哨兵模式高可用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、序言Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Red...
    99+
    2023-06-29
  • redis 哨兵集群搭建的实现
    目录前言为什么需要哨兵集群搭建前准备搭建步骤集群测试前言 在上一篇,我们了解了Redis 复制集群的完整的搭建流程,本篇来分享一下如何搭建 redis 哨兵集群。 为什么需要哨兵集群 redis哨兵集群要解决的问题是什么...
    99+
    2022-08-10
    redis 哨兵集群搭建 redis 哨兵集群
  • redis 哨兵集群搭建的实现
    目录前言为什么需要哨兵集群搭建前准备搭建步骤集群测试前言 在上一篇,我们了解了redis 复制集群的完整的搭建流程,本篇来分享一下如何搭建 redis 哨兵集群。 为什么需要哨兵集群...
    99+
    2022-11-13
    redis 哨兵集群搭建 redis 哨兵集群
  • Redis sentinel哨兵集群的实现步骤
    目录一、Redis sentinel哨兵集群概述(1)Redis哨兵概述(2)Redis哨兵的工作机制(3)哨兵的三个定时监控任务二、部署Redis哨兵系统(1)实验环境(2)实验步骤 -在每台服务器上都安装Redis一...
    99+
    2022-07-14
    Redis sentinel哨兵集群 Redis sentinel哨兵
  • redis实现sentinel哨兵架构的方法
    目录1、Redis哨兵(Sentinel)1.1、redis集群介绍1.2、redis哨兵(Sentinel)的工作原理1.2.1sentinel中的三个定时任务:1.3、实现哨兵1.3.1、实现哨兵需要先实现一下主从复...
    99+
    2022-11-12
  • Redis中的哨兵模式如何实现
    这篇文章主要介绍Redis中的哨兵模式如何实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis Sentinel哨兵模式 是一个分布式系统, 你可以在一个架构中运行多个 Se...
    99+
    2022-10-19
  • springboot集成redis哨兵主从的实现
    目录一、环境二、POM文件三、application.yml配置四、reidsTemplate配置五、单元测试(JUnit4)一、环境 spring boot 2.3.12.RELE...
    99+
    2022-11-13
  • Redis sentinel哨兵集群的实现步骤
    目录一、Redis sentinel哨兵集群概述(1)Redis哨兵概述(2)Redis哨兵的工作机制(3)哨兵的三个定时监控任务二、部署Redis哨兵系统(1)实验环境(2)实验步...
    99+
    2022-11-13
  • redis哨兵常用命令和监控的示例分析
    这篇文章将为大家详细讲解有关redis哨兵常用命令和监控的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sentinel monitor advertise 192.168.0.5 28001 2...
    99+
    2023-06-15
  • Redis中主从复制、哨兵、集群的示例分析
    这篇文章将为大家详细讲解有关Redis中主从复制、哨兵、集群的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Redis 主从复制1. 主从复制的概述主从复制,...
    99+
    2022-10-19
  • redis主从复制、哨兵和集群的示例分析
    这篇文章主要介绍了redis主从复制、哨兵和集群的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、主从复制1. 主从同步的用处  ...
    99+
    2022-10-19
  • Nginx代理Redis哨兵主从配置怎么实现
    本篇内容介绍了“Nginx代理Redis哨兵主从配置怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、环境Nginx版本:1.21....
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作