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

news2024/11/24 19:15:48

在这里插入图片描述

谈一谈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.coloradmin.cn/o/1343426.html

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

相关文章

Unity Meta Quest 一体机开发(十二):【手势追踪】Poke 交互 - 用手指点击由 3D 物体制作的 UI 按钮

文章目录 &#x1f4d5;教程说明&#x1f4d5;给玩家配置 HandPokeInteractor&#x1f4d5;用 3D 物体制作可以被点击的 UI 按钮⭐搭建物体层级⭐给物体添加脚本⭐为脚本变量赋值 &#x1f4d5;模仿官方样例按钮的样式&#x1f4d5;在按钮上添加文字&#x1f4d5;修改按钮图片 …

面试题:说一下Spring 中的 @Cacheable 缓存注解?

文章目录 1 什么是缓存2 本地缓存和集中式缓存3 本地缓存的优点4 Spring对于缓存的支持4.1 spring支持的CacheManager4.2 GuavaCache4.3 引入依赖4.4 创建配置类4.5 缓存注解4.6 Cacheable的用法 5 Cacheable失效的原因 1 什么是缓存 第一个问题&#xff0c;首先要搞明白什么是…

6130 树的最长路

思路&#xff1a;树的最长路问题可以通过两次 DFS 求解&#xff0c;具体思路如下&#xff1a; 1.第一次 DFS 求树的直径 以任意一个点为起点进行深度优先遍历&#xff08;DFS&#xff09;&#xff0c;找到与该点距离最远的点 u 。 以 u 为起点进行 DFS &#xff0c;找到与 u 距…

MySQL 执行过程

MySQL 的执行流程也确实是一个复杂的过程&#xff0c;它涉及多个组件的协同工作&#xff0c;故而在面试或者工作的过程中很容易陷入迷惑和误区。 MySQL 执行过程 本篇将以 MySQL 常见的 InnoDB 存储引擎为例&#xff0c;为大家详细介绍 SQL 语句的执行流程。从连接器开始&…

uniapp门店收银,点击右边商品,商品会进入左边的购物车,并且,当扫码枪扫描商品条形码,商品也会累计进入购物车

效果&#xff1a; 代码&#xff1a; <template><view class"container"><view class"top" style"height: 10%; margin-bottom: 20rpx; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);"><view class"box" style&q…

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

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

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a;“我会做这种&#xff01;” 原来他会…

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了&#xff0c;近期一直在忙项目的事&#xff0c;才有时间写博客&#xff0c;近期频繁出现sql问题&#xff0c;今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警&#xff0c;有个6千万的日志表&#xff0c;查询耗时大…

YOLO训练results.csv文件可视化(原模型与改进模型对比可视化)

一、单独一个文件可视化&#xff08;源码对应utils文件夹下的plots.py文件的plot_results类&#xff09; from pathlib import Path import matplotlib.pyplot as plt import pandas as pd def plot_results(fileruns/train/exp9/results.csv, dir):# Plot training results.c…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ 可定制化

工程项目管理软件是现代项目管理中不可或缺的工具&#xff0c;它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件&#xff0c;该软件采用先进的Vue、Uniapp、Layui等技术框架&#xff0c;涵盖了项目策划决策、规划设计、施工建设到竣工交付…

机器学习距离度量方法

1. 机器学习中为什么要度量距离&#xff1f; 机器学习算法中&#xff0c;经常需要 判断两个样本之间是否相似 &#xff0c;比如KNN&#xff0c;K-means&#xff0c;推荐算法中的协同过滤等等&#xff0c;常用的套路是 将相似的判断转换成距离的计算 &#xff0c;距离近的样本相…

cdn引入React以及React-dom—数组遍历渲染时setExtraStackFrame报错

在引入react官网提供的cdn后&#xff0c;部分静态页面没有问题&#xff0c;但是使用到 一下循环的页面则会报错。 const devReactCdn [https://unpkg.com/react18/umd/react.development.js,https://unpkg.com/react-dom18/umd/react-dom.development.js, ]; const prodReact…

计算机网络【DHCP动态主机配置协议】

DHCP 出现 电脑或手机需要 IP 地址才能上网。大刘有两台电脑和两台手机&#xff0c;小美有一台笔记本电脑、一台平板电脑和两台手机&#xff0c;老王、阿丽、敏敏也有几台终端设备。如果为每台设备手动配置 IP 地址&#xff0c;那会非常繁琐&#xff0c;一点儿也不方便。特别是…

web前端开发网页制作html/css结课作业

效果图展示&#xff1a; 注意事项&#xff1a; 引用JQuery文件地址和图片地址要更换一下。 百度网盘链接&#xff1a; http://链接&#xff1a;https://pan.baidu.com/s/1wYkmLr7csjBwQY6GmlYm4Q?pwd4332 提取码&#xff1a;4332 html界面展示&#xff1a; main.css代码部…

2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码

题目背景&#xff1a;目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条&#xff0c;聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大…

docker-compose安装及转换为k8s集群部署

docker-compose安装及转换为k8s集群部署 一、docker-compose安装 1、下载 curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 2、指定位置 放入/usr/local/bin/ 路径下&#xff1a; mv docker-compose-linux-x86_64 docke…

pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

一、问题描述 在VS Code中运行Terminal中运行pnpm install&#xff08;npm或yarn也类似&#xff09;报错&#xff1a; S D:\workspace\xxx\xxx> pnpm install pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息…

K8s陈述式资源管理

命令行&#xff1a;kubectl命令行工具 优点&#xff1a;90%以上的场景都可以满足 对资源的增删改查比较方便&#xff0c;对改不是很友好。 缺点&#xff1a;命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式&#xff1a; 看到声明式都是k8s当中的yml文件来实现资源管理…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文&#xff0c;提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类&#xff0c;论文不仅显示了模型还构建了完整的…

无需翻墙|Stable Diffusion WebUI 安装|AI绘画

前言 最近终于有机会从围墙里往外看&#xff0c;了解到外面的世界已经有了天翻地覆的变化&#xff0c;感叹万千&#xff0c;笔者在本地mac&#xff0c;windows&#xff0c;linux&#xff0c;docker部署了不下20遍后&#xff0c;整理出来的linux极简避坑安装方案&#xff0c;供…