【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式

在这里插入图片描述

谈一谈Redis的集群模式

  • ✔️ 谈一谈Redis的集群模式
  • ✔️主从模式
    • ✔️ 特点
    • ✔️Redis主从模式Demo
  • ✔️哨兵模式
    • ✔️Redis哨兵模式Demo
    • ✔️特点
  • ✔️Cluster模式
    • ✔️Redis Cluster模式Demo
    • ✔️特点


✔️ 谈一谈Redis的集群模式


Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是:主从复制(Master-Slave Replication) 、哨兵模式 (Sentinel) 和Redis Cluster模式。


✔️主从模式


主从复制是Redis最简单的集群模式。这个模式主要是为了解决单点故障的问题,所以将数据复制多个副本中,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。


主从模式中,包括一个主节点(Master)和一个或多个从节点(Save) 。主节点负责处理所有写操作和读操作而从节点则复制主节点的数据,并且只能处理读操作。当主节点发生故障时,可以将一个从节点升级为主节点,实现故转移(需要手动实现)。


在这里插入图片描述

主从复制的优势在于简单易用,适用于读多写少的场景。它提供了数据备份功能,并且可以有很好的扩展性,只要增加更多的从节点,就能让整个集群的读的能力不断提升。


但是主从模式最大的缺点,就是不具备故障自动转移的能力,没有办法做容错和恢复。


主节点和从节点的宕机都会导致客户端部分读写请求失败,需要人工介入让节点恢复或者手动切换一台从节点服务器变成主节点服务器才可以。并且在主节点宕机时,如果数据没有及时复制到从节点,也会导致数据不一致。


在这里插入图片描述


✔️ 特点

主从模式的优点:

  1. 数据冗余:提高数据可靠性和可用性。
  2. 读负载分担:减轻主节点负载,提高系统吞吐量和响应性能。
  3. 故障恢复:实现故障自动恢复。

主从模式的缺点:

  1. 配置和管理复杂。
  2. 数据一致性问题。
  3. 资源消耗:需要额外服务器资源。

✔️Redis主从模式Demo


确保已安装并配置好Redis服务器,并启动主节点和从节点。

添加Jedis库依赖。如果使用Maven,请在pom.xml文件中添加以下依赖:


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

import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisMaster;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPubSub;  
import java.util.HashSet;  
import java.util.Set;  
  
public class RedisMasterSlaveExample {  
    public static void main(String[] args) {  
        // 创建主节点连接池  
        JedisPool masterPool = new JedisPool("localhost", 6379);  
        // 从连接池中获取主节点连接  
        Jedis master = masterPool.getResource();  
        master.auth("your_password"); // 如果设置了密码,请进行认证  
        master.flushAll(); // 清空主节点数据,可选操作  
  
        // 创建从节点连接池  
        JedisPool slavePool = new JedisPool("localhost", 6380); // 从节点的端口号可能与主节点不同  
        // 从连接池中获取从节点连接  
        Jedis slave = slavePool.getResource();  
        slave.auth("your_password"); // 如果设置了密码,请进行认证  
        slave.flushAll(); // 清空从节点数据,可选操作  
  
        // 配置主从复制  
        master.slaveof("yes", "localhost", 6380); // 将当前服务器配置为另一个服务器的从服务器  
        slave.sync(); // 同步所有键到从节点,也可以选择同步特定键  
  
        // 发布和订阅示例(可选)  
        Set<String> channels = new HashSet<>();  
        channels.add("testChannel"); // 订阅的频道名称  
        slave.psubscribe(new JedisPubSub() { // 在从节点上订阅频道消息  
            @Override  
            public void onPMessage(String channel, String message) { // 接收到消息时的回调方法  
                System.out.println("Received message on " + channel + ": " + message);  
            }  
        }, channels);  
        master.publish("testChannel", "Hello from master!"); // 在主节点上发布消息到频道中,从节点会接收到该消息  
    }  
}

✔️哨兵模式


为了解决主从模式的无法自动容错及恢复的问题,Redis引入了一种哨兵模式的集群架构。


哨兵模式是在主从复制的基础上加入了哨兵节点。哨兵节点是一种特殊的Redis节点,用于监控主节点和从节点的状态。当主节点发生故障时,哨兵节点可以自动进行故障转移,选择一个合适的从节点升级为主节点,并通知其他从节点和应用程序进行更新。


在这里插入图片描述

在原来的主从架构中,引入哨兵节点,其作用是监控Redis主节点和从节点的状态。每个Redis实例都可以作为哨兵节点,通常需要部署多个哨兵节点,以确保故障转移的可靠性。


哨兵节点定期向所有主节点和从节点发送PING命令,如果在指定的时间内未收到PONG响应,哨兵节点会将该书点标记为主观下线。如果一个主节点被多数哨兵节点标记为主观下线,那么它将被标记为客观下线


当主节点被标记为客观下线时,哨兵节点会触发故障转移过程。它会从所有健康的从节点中选举一个新的主节点并将所有从节点切换到新的主节点,实现自动故障转移。同时,哨兵节点会更新所有客户端的配置,指向新的主节点。


哨兵节点通过发布订阅功能来通知客户端有关主节点状态变化的消息。客户端收到消息后,会更新配置,将新的主节点信息应用于连接池,从而使客户端可以继续与新的主节点进行交互。


✔️Redis哨兵模式Demo


import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisSentinelPool;  
  
public class RedisSentinelExample {  
    public static void main(String[] args) {  
        // 创建哨兵连接池  
        String masterName = "mymaster"; // 哨兵配置中的主节点名称  
        String sentinelHost = "localhost"; // 哨兵节点的地址  
        int sentinelPort = 26379; // 哨兵节点的端口号  
        Set<String> sentinels = new HashSet<>();  
        sentinels.add(sentinelHost + ":" + sentinelPort); // 添加一个或多个哨兵节点地址  
        JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName, sentinels);  
        // 从连接池中获取连接  
        Jedis jedis = sentinelPool.getResource();  
        jedis.auth("your_password"); // 如果设置了密码,请进行认证  
  
        // 执行一些操作,例如设置和获取数据  
        jedis.set("key", "value");  
        String value = jedis.get("key");  
        System.out.println("Value: " + value);  
  
        // 关闭连接池和连接  
        jedis.close();  
        sentinelPool.close();  
    }  
}

✔️特点

这个集群模式的优点就是为整个集群系统了一种故障转移和恢复的能力。


✔️Cluster模式


Redis Cluster是Redis中推荐的分布式集群解决方案,它将数据自动分片到多个节点上,每个节点负责一部分数据。


在这里插入图片描述

Redis Cluster采用主从复制模式来提高可用性。每个分片都有一个主节点和多个从节点。主节点负责处理写操作,而从节点负责复制主节点的数据并处理读请求。


Redis Cluster能够自动检测节点的故障。当一个节点失去连接或不可达时,Redis Cluster会尝试将该节点标记为不可用,并从可用的从节点中提升一个新的主节点。


Redis Cluster是适用于大规模应用的解决方案,它提供了更好的横向扩展和容错能力。它自动管理数据分片和故障转移,减少了运维的负担。


✔️Redis Cluster模式Demo



import redis.clients.jedis.JedisCluster;  
import redis.clients.jedis.HostAndPort;  
import redis.clients.jedis.JedisClusterConnectionHandler;  
import redis.clients.jedis.JedisPoolConfig;  
  
import java.util.HashSet;  
import java.util.Set;  
  
public class RedisClusterExample {  
    public static void main(String[] args) {  
        // 创建集群连接池配置  
        JedisPoolConfig poolConfig = new JedisPoolConfig();  
        // 设置连接池参数  
        poolConfig.setMaxTotal(100); // 连接池最大连接数  
        poolConfig.setMaxIdle(50); // 连接池最大空闲数  
        poolConfig.setMinIdle(10); // 连接池最小空闲数  
        poolConfig.setTestOnBorrow(true); // 获取连接时进行有效性检查  
        poolConfig.setTestOnReturn(true); // 归还连接时进行有效性检查  
        poolConfig.setTestWhileIdle(true); // 空闲时定期进行有效性检查  
  
        // 创建集群连接处理器  
        JedisClusterConnectionHandler connectionHandler = new JedisClusterConnectionHandler();  
        Set<HostAndPort> jedisClusterNodes = new HashSet<>();  
        // 添加集群节点,包括每个节点的地址和端口号  
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));  
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7380));  
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7381));  
        // ...添加更多节点  
        connectionHandler.setClusterNodes(jedisClusterNodes);  
        connectionHandler.setPoolConfig(poolConfig);  
        connectionHandler.setPassword("your_password"); // 如果设置了密码,请进行认证  
  
        // 创建集群连接对象并执行操作  
        JedisCluster jedisCluster = new JedisCluster(connectionHandler);  
        jedisCluster.set("key", "value"); // 设置键值对  
        String value = jedisCluster.get("key"); // 获取键值对  
        System.out.println("Value: " + value);  
  
        // 关闭集群连接对象和连接处理器  
        jedisCluster.close();  
        connectionHandler.close();  
    }  
}


在这个Demo中,使用JedisCluster类来与Redis Cluster模式进行交互。首先,我们创建了一个JedisPoolConfig对象来配置连接池的参数。然后,我们创建了一个JedisClusterConnectionHandler对象来处理集群节点的连接。接下来,我们将集群节点添加到连接处理器中,并设置连接池配置和密码(如果设置了密码)。最后,我们创建了一个JedisCluster对象来执行操作,并使用set和get方法来设置和获取键值对。在完成后,我们关闭了集群连接对象和连接处理器。请注意,这只是一个简单的示例,实际应用中可能需要更多的配置和错误处理。


✔️特点


Cluster模式的特点是数据分片存诸在不同的节点上,每人节点都可以单独对外提供读写服务。不存在单点故障的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/278741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域&#xff0c;各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域&#xff0c;不同电气产品的外壳、组件材质采用不同材料&#xff0c;以同为科技&#xff08;TOWE&#xff09;电气产品为例&#xff0c;工业连接器系列产品采用PA6外壳材质、机…

【SD】一致性角色 - 表情差异生成 【1】

原理&#xff1a;通过segment 局部重绘 可以根据lora 产生面部表情图片 模型&#xff1a;sam_vit_h_4b8939.pth 导入图片到segment 开启&#xff1a;Enable GroundingDINO GroundingDINO Detection Prompt &#xff1a;输入 face 然后点击&#xff1a;Preview Segmentation …

如何文件从电脑传到iPhone,这里提供几个方法

本文介绍了如何使用Finder应用程序、iTunes for Windows、iCloud和谷歌照片将照片从Mac或PC传输到iPhone。 如何将照片从Mac传输到iPhone 如果你有一台Mac电脑&#xff0c;里面装满了你想转移到iPhone的照片&#xff0c;这是一件非常简单的事情。只需遵循以下步骤&#xff1a…

LIUNX进程程序替换

1.什么是程序替换 a.一个程序&#xff0c;只能执行自己的代码 b.如果想要一个程序执行&#xff0c;别的程序的代码呢&#xff1f; 我们就可以创建一个子进程&#xff0c;将这个子进程替换为我们想要执行的程序。 2.样例代码-----execl&#xff08;接口&#xff09; 返回值&…

跨进程通信 macOS XPC 创建实例

一&#xff1a;简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单&#xff0c;但是比较绕。 主要需要集成 XPC Server 这个模块&#xff0c;这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭&#xff0c; 我们主app 进…

交叉编译aarch64架构支持openssl的curl、libcurl

本文档旨在指导读者在x86_64平台上交叉编译curl和openssl库以支持aarch64架构。在开始之前&#xff0c;请确保您的系统环境已正确配置。 1. 系统环境准备 系统是基于Ubuntu 20.04 LTS&#xff0c;高版本可能会有问题。首页&#xff0c;安装必要的开发工具和库文件。打开终端并…

QML 怎么调用 C++ 中的内容?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ 先说明一下测试环境 编译器&#xff1a;vs2017x64 开发环境&#xff1a;Qt5.12 这里主要是总结一下&#xff0c;怎么在…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…

MFC随对话框大小改变同时改变控件大小

先看一下效果; 初始; 窗口变大,控件也变大; 二个也可以; 窗口变大,控件变大; 默认生成的对话框没有WM_SIZE消息的处理程序;打开类向导,选中WM_SIZE消息,对CxxxDlg类添加该消息的处理程序;默认生成的函数名是OnSize; 添加了以后代码中会有三处变化; 在对话框类的…

嵌入式SOC之通用图像处理之OSD文字信息叠加的相关实践记录

机缘巧合 机缘巧合下, 在爱芯元智的xx开发板下进行sdk的开发.由于开发板目前我拿到是当前最新的一版(估计是样品)&#xff0c;暂不公开开发板具体型号信息.以下简称板子 .很多优秀的芯片厂商,都会提供与开发板配套的完善的软件以及完善的技术支持(FAE)&#xff0c;突然觉得爱芯…

鸿蒙(HarmonyOS 3.1) DevEco Studio 3.1开发环境汉化

鸿蒙&#xff08;HarmonyOS 3.1&#xff09; DevEco Studio 3.1开发环境汉化 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、设置过程 打开IDE&#xff0c;在第一个菜单File 中找到Settings...菜单 在Setting...中找到Plugins…

VSCode远程开发配置

目录 概要远程开发插件安装开始连接SSH无密码登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码&#xff0c;使用远程开发&#xff0c;可以在与生产环境相同的环境中开发、测试和部署代码&#xff0c;减少因环境不同而导致的问题。当下VSCode远程开发是支持的比…

用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

随着人工智能技术的迅猛发展&#xff0c;问答机器人在多个领域中展示了广泛的应用潜力。在这个信息爆炸的时代&#xff0c;许多领域都面临着海量的知识和信息&#xff0c;人们往往需要耗费大量的时间和精力来搜索和获取他们所需的信息。 在这种情况下&#xff0c;垂直领域的 A…

初识Sringboot3+vue3环境准备

环境准备 后端环境准备 下载JDK17https://www.oracle.com/java/technologies/downloads/#jdk17-windows 安装就下一步下一步,选择安装路径 配置环境 环境 JDK17、IDEA2021、maven3.5、vscode 后端 基础&#xff1a;javaSE&#xff0c;javaWeb、JDBC、SMM框架&#xff08;Spr…

Vscode新手安装与使用

安装与版本选择 VS Code 有两个不同的发布渠道&#xff1a;一个是我们经常使用的稳定版&#xff08;Stable&#xff09;&#xff0c;每个月发布一个主版本&#xff1b;另外一个发布渠道叫做 Insiders&#xff0c;每周一到周五 UTC 时间早上6点从最新的代码发布一个版本&#x…

【网络安全 | CTF】FlatScience

该题考察SQL注入 正文 后台扫到robots.txt 页面内容如下&#xff1a; 进入login.php 页面源代码如图&#xff1a; 传参debug得到php代码&#xff1a; <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3…

小米手机小游戏隐私问题解决方案

1.由于laya底层代码调用获取设备信息&#xff0c;导致原先启动laya引擎后才去弹出隐私政策条款的功能是过不了审核的&#xff0c;所以需要在android的设计一个隐私条款的弹窗&#xff0c;玩家同意条款后才启动laya引擎&#xff1a; &#xff08;1&#xff09;定义隐私条款弹窗的…

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分&#xff0c;它就像一款程序生活中不可或缺的零件&#xff0c;没了它&#xff0c;程序肯定跑不起来。想想看&#xff0c;没有一个重要的零件&#xff…

Proxyman:现代本地Web调试代理工具

1. 简介 1.1 什么是Proxyman&#xff1f; Proxyman是一款专为macOS设计的现代本地Web调试代理工具&#xff0c;它不仅支持macOS平台&#xff0c;还能无缝地与iOS和Android设备进行集成。作为一个网络调试工具&#xff0c;Proxyman的设计旨在提供高性能、直观且功能丰富的解决…

【FFI】N-API的JS堆对象生命周期管理

N-API的JS堆对象生命周期管理 N-API是Node API的简写&#xff0c;同时也是nodejs的JS VM&#xff08;链&#xff09;接入原生模块.node文件的应用程序二进制接口(i.e. ABI)。借助N-API引入的抽象隔离&#xff0c;升级nodejs运行时&#xff08;虚拟机&#xff09; 【编译】不要求…