【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模式的特点是数据分片存诸在不同的节点上,每人节点都可以单独对外提供读写服务。不存在单点故障的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装常用的软件(jdk,MySQL,nginx)并完成对前后端项目的部署发布

linux软件安装&#xff1a; 安装方式介绍&#xff1a; 二进制发布包安装&#xff1a; 软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可 rpm安装&#xff1a; 软件已经按照redhat的包管理规范进行打包&#xff0c;使用rpm命令进行安装&#xff0…

简单了解SQL宽字节注入与httpXFF头注入(基于sqllabs演示)

1、宽字节注入 sqllabs-less-32为例 使用单引号进行测试 提示我们输入的单引号被转义符 \ 进行了转义&#xff0c;即转义符自动的出现在输入的特殊字符前面&#xff0c;这是防止sql注入的一种方法&#xff0c;导致无法产生报错。 这种情况我们就可以尝试宽字节注入&#xff…

Android NDK打包armeabi平台架包

NDK打包armeabi 1.降低NDK版本和Cmake版本 sdk.dirE\:\\Android\\sdk //指定ndk版本&#xff0c;不指定默认使用最新的NDK ndk.dirE\:\\Android\\sdk\\ndk\\16.1.4479499修改builde.gradle(app) android{defaultConfig{...//配置 AS 工程的 C/C 源文件编译参数externalNativ…

市场复盘总结 20231229

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: -- 今日 SELECT * FROM (SELECT TOP 100 CODE,20231229 入选日期,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIM…

工厂方法?按图索骥!

前言 还记得在第3节的简单工厂模式&#xff0c;我们实现了一个简易计算器。简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断&#xff0c;根据客户端的选择条件动态实例化相关类&#xff0c;去除了与具体运算类的依赖。 但其问题也就在这里&#xff0c;如果要加一个‘…

SparkCore

一、RDD详解 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。 Dataset:一个数据集合,用于存放数据的。Distributed:RDD中的数据是分布式存储的,可用于分布式…

vue连接本地服务器

vue 连接本地服务器做后端。 后端服务 使用springboot新建一个基于restful的接口&#xff0c;访问如下的地址&#xff0c;返回值。 vue构建 新建一个vue项目&#xff0c;安装访问服务器的插件。 npm install axios vue-axios --save 修改main.js使用axios&#xff0c;最终…

Mybatis插件入门

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

GPT4All : 便捷易用的本地智能问答推理软件(乱记)

安装与使用 去官网 https://gpt4all.io/index.html下载可执行文件。 打开应用即可看到是否共享数据的选项&#xff1a; 然后自动进入模型下载界面 测试 内存占用 缺点&#xff1a;在我本地的轻薄本上运行时&#xff0c;风扇会有轻微噪声&#xff0c;关闭软件很久都没停止。…

《深入理解JAVA虚拟机笔记》运行时栈帧、方法分派、动态类型

运行时栈帧结构 Java 虚拟机以方法作为最基本的执行单元&#xff0c;“栈帧”&#xff08;Stack Frame&#xff09;则是用于支持虚拟机进行方法调用和方法执行背后的数据结构&#xff0c;它也是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈…

【教学类-43-04】20231229 N宫格数独4.0(n=2,4,6,8) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 幼儿表示自己适合做5宫格 第一次AI生成九宫格数独python代码 【教学类-43-03】20231229 N宫格数独3.0&#xff08;n1、2、3、4、6、8、9&#xff09; &#xff08;ChatGPT AI对话大师生成&#xff09;-CSDN博客文章浏览阅读162次&…

webpack打包批量替换路径(string-replace-webpack-plugin插件)

string-replace-webpack-plugin 是一个用于在 webpack 打包后的文件中替换字符串的插件。它可以用于将特定字符串替换为其他字符串&#xff0c;例如将敏感信息从源代码中移除或对特定文本进行本地化处理。比如文件的html、css、js中的路径地址想批量更改一下 http://localhost:…

【2023年终总结】纵是一路仆仆风尘,也莫忘了仰头

文章目录 1. 写在前面2. 关于生活3. 关于工作4. 关于以后 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

搭建flink集群 —— 筑梦之路

Apache Flink 是一个框架和分布式处理引擎&#xff0c; 用于在无边界和有边界数据流上进行有状态的计算。 Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 Flink并没有依靠自身实现所有分布式系统需要解决的问题&#xff0c; 而是在已有集群…

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

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

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

贪心算法Part01 455分发饼干

455分发饼干 376摆动序列 53 最大子数组和

AIGC系统ChatGPT系统源码,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图+思维导图一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

CSS animation动画和关键帧实现轮播图效果HTML

CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果&#xff0c;不需要js控制&#xff0c;但是其中的缺点就是不能使用鼠标进行切换效果。 具有代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

华为无线AC内三层漫游配置详解

重要说明 1、在一台ac中实现三层漫游 2、ac和核心的互联vlan和ap的管理vlan是同一个广播域&#xff0c;可以不用配option 43 3、直接转发模式&#xff0c;ac上可以不起业务vlan&#xff0c;ac和核心交换机上可以只放行一个互联vlan 10 4、ac上要启两个vap魔板&#xff0c;两个…