【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) 。主节点负责处理所有写操作和读操作而从节点则复制主节点的数据,并且只能处理读操作。当主节点发生故障时,可以将一个从节点升级为主节点,实现故转移(需要手动实现)。

主从复制的优势在于简单易用,适用于读多写少的场景。它提供了数据备份功能,并且可以有很好的扩展性,只要增加更多的从节点,就能让整个集群的读的能力不断提升。
但是主从模式最大的缺点,就是不具备故障自动转移的能力,没有办法做容错和恢复。
主节点和从节点的宕机都会导致客户端部分读写请求失败,需要人工介入让节点恢复或者手动切换一台从节点服务器变成主节点服务器才可以。并且在主节点宕机时,如果数据没有及时复制到从节点,也会导致数据不一致。

✔️ 特点
主从模式的优点:
- 数据冗余:提高数据可靠性和可用性。
- 读负载分担:减轻主节点负载,提高系统吞吐量和响应性能。
- 故障恢复:实现故障自动恢复。
主从模式的缺点:
- 配置和管理复杂。
- 数据一致性问题。
- 资源消耗:需要额外服务器资源。
✔️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模式的特点是数据分片存诸在不同的节点上,每人节点都可以单独对外提供读写服务。不存在单点故障的问题。
相关文章:
【23.12.29期--Redis缓存篇】谈一谈Redis的集群模式
谈一谈Redis的集群模式 ✔️ 谈一谈Redis的集群模式✔️主从模式✔️ 特点✔️Redis主从模式Demo ✔️哨兵模式✔️Redis哨兵模式Demo✔️特点 ✔️Cluster模式✔️Redis Cluster模式Demo✔️特点 ✔️ 谈一谈Redis的集群模式 Redis有三种主要的集群模式,用于在分布…...
【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串
647. 回文子串 647. 回文子串 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…...
欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒
出品|欧科云链研究院 2024年,Web3与AI两个数字科技的巅峰碰撞,欧科云链研究院探索AI与Web3的技术融合,与澎湃科技联合发布2024年展望,原标题为《2024年展望:Web3与AI共振引爆可信数字社会》,共…...
【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【数学】2023C-素数之积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入描述输出描述示例输入输出说明 解题思路暴力解质数筛 代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 RSA加密算法在网络安全世界中无处不在,它利用了极大些数因数分解的闲难…...
uniapp路由
1、路由登记 uni-app页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。 类似小程序在 app.json 中配置页面路由一样。 所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue Router 方式管理路由,…...
湖南大学-数据库系统-2023期末考试【原题】
前言 早上11:00考完的考试,下午回来打了三把LOL之后,凭着回忆把题目重现出来了。 在复习的时候刷了15,16,17,18,19,21六年的卷子,感觉题目都差不多,但是难度…...
【Java EE初阶九】多线程案例(线程池)
一、线程池的引入 引入池---->主要是为了提高效率; 最开始,进程可以解决并发编程的问题,但是代价有点大了,于是引入了 “轻量级进程” ---->线程 线程也能解决并发编程的问题,而且线程的开销比进程要小的多&…...
理解 Node.js 中的事件循环
你已经使用 Node.js 一段时间了,构建了一些应用程序,尝试了不同的模块,甚至对异步编程感到很舒适。但是有些事情一直在困扰着你——事件循环(Event Loop)。 如果你像我一样,花费了无数个小时阅读文档和观看…...
Mac 软件出现「意外退出」及「打不开」解决方法
Mac 软件出现「意外退出」及「打不开」解决方法 软件出现意外退出及软件损坏的情况,这是因为苹果删除了TNT的证书,所以大部分TNT破解的Mac软件会出现无法打开,提示意外退出。 终端需先安装Xcode或Apple命令行工具 如未装Xcode可以使用下列命…...
随机森林 3(代码)
通过随机森林 1和随机森林 2 的介绍,相信大家对理论已经了解的很透彻,接下来带大家敲一下代码,不懂得可以加我入群讨论。 第一份代码是比较原始的代码,第二份代码是第一段代码中引用的primitive_plot,第三份代码是使用…...
勒索事件急剧增长,亚信安全发布《勒索家族和勒索事件监控报告》
近期(12.15-12.21)态势快速感知 近期全球共发生了247起攻击和勒索事件,勒索事件数量急剧增长。 近期需要重点关注的除了仍然流行的勒索家族lockbit3以外,还有本周top1勒索组织toufan。toufan是一个新兴勒索组织,本周共发起了108起勒索攻击&a…...
LeetCode1523. Count Odd Numbers in an Interval Range
文章目录 一、题目二、题解 一、题目 Given two non-negative integers low and high. Return the count of odd numbers between low and high (inclusive). Example 1: Input: low 3, high 7 Output: 3 Explanation: The odd numbers between 3 and 7 are [3,5,7]. Exam…...
E中国铜金属行业需求前景及未来发展机遇分析报告2024-2030年
E中国铜金属行业需求前景及未来发展机遇分析报告2024-2030年 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 《报告编号》: BG471816 《出…...
python SVM 保存和加载模型参数
在 Python 中,你可以使用 scikit-learn 库中的 joblib 或 pickle 模块来保存和加载 SVM 模型的参数。以下是一个简单的示例代码,演示了如何使用 joblib 模块保存和加载 SVM 模型的参数: 保存模型参数: from sklearn import svm …...
JAVA进化史: JDK12特性及说明
JDK 12于2019年3月发布。这个版本相对于之前的版本来说规模较小,主要集中在一些改进和实验性的特性上。以下是JDK 12的一些主要特性: 引入了实验性的Shenandoah垃圾收集器 JDK 12引入了实验性的Shenandoah垃圾收集器,旨在实现极低的暂停时间…...
Databend 的算力可扩展性
作者:尚卓燃(PsiACE) 澳门科技大学在读硕士,Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer PsiACE (Chojan Shang) GitHub 对于大规模分布式数据处理系统,为了更好应对数据、流量、和复杂性的增长…...
「解析」Windows 如何优雅使用 Terminal
所谓工欲善其事必先利其器,对于开发人员 Linux可能是首选,但是在家学习的时候,我还是更喜欢使用 Windows系统,首先是稳定,其次是习惯了。当然了,我还有一台专门安装 Linux系统的小主机用于学习Linux使用&am…...
Linux第18步_安装“Ubuntu系统下的C语言编译器GCC”
Ubuntu系统没有提供C/C的编译环境,因此还需要手动安装build-essential软件包,它包含了 GNU 编辑器,GNU 调试器,和其他编译软件所必需的开发库和工具。本节用于重点介绍安装“Ubuntu系统下的C语言编译器GC&a…...
【Linux】Linux 基础命令 crontab命令
1.crontab命令 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动…...
14:00面试,14:08就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到10月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
