当前位置: 首页 > news >正文

Redis的四种模式:单机、主从、哨兵、集群

一、简单理解

单机模式:安装你的redis,启动服务即为单机模式。

主从模式:一个主节点搭配一个或多个从节点,无自动故障转移功能,主节点发生故障后,需要人工将其中一个从节点设置为主节点。

哨兵模式:主从模式加上自动故障转移功能即为哨兵模式,主节点发生故障后,会自动将其中一个从节点设置为主节点。

集群模式:每个节点存储一部分数据,所有节点的数据汇总即为完整的数据,具有自动故障转移功能。

二、具体介绍

1.单机模式

在单机模式下,只运行着一个 Redis 服务器实例,这是最简单的部署方式。

优点: 部署简单,适合开发和测试环境。

缺点: 存在单点故障,没有数据冗余或者故障转移的能力,且性能受限于单台机器。

原理: 所有的数据存储与处理都在单一实例上进行。

2.主从模式(或称主从复制模式)

主从模式涉及一个主节点(master)和一个或多个从节点(slave)。从节点是主节点的精确副本,并可以用于读操作,以分担主节点的负载。

优点: 读操作可以扩展,通过增加从节点数量。从节点可以在主节点故障时实现故障转移。

缺点: 所有的写操作都必须在主节点进行,因此写操作的扩展性受限。此外,在主节点失效的情况下,系统并不会自动进行故障转移到从节点。

原理: 主节点负责处理所有写操作,并将数据更改同步到所有从节点。从节点可以接受客户端的读请求。

3.哨兵(Sentinel)模式

哨兵模式是建立在主从模式之上的一个系统。它使用一个或多个 Sentinel 进程来监控主从节点的健康状况,并自动执行故障转移操作。

优点: 实现了更高的可用性,提供了自动故障转移。可以实现主节点的自动选举及故障通知。

缺点: Sentinel 的部署和配置相对复杂一些,对网络要求更高,网络分区可能导致错误的故障切换。

原理: Sentinel 进程持续检查主从节点的健康状态。如果主节点失效,Sentinel 会选举一个从节点晋升为新的主节点,其余从节点将更新配置以复制新主节点。

4.集群模式

集群模式允许数据在多个节点间自动分片,每个节点只存储一部分数据。

优点: 提供高可用性和良好的水平扩展能力。当某个节点失效时,只有该节点的一部分数据不可用,而其他节点继续工作。

缺点: 集群模式更加复杂,需要更多的维护工作,对硬件和网络的要求也更高。

原理: 数据根据它们的键进行分片,每个分片又称为一个槽(Slot)。集群内部有16384个槽,每个节点负责其中一部分。当进行数据操作时,Redis 使用CRC16算法对键进行哈希计算,然后根据其结果将数据定位到对应的槽,并由相应的节点处理。

注意:

不同的部署模式适应不同的应用场景和需求。

在对数据可靠性和可用性要求极高的生产环境中,通常会选择哨兵模式或集群模式。

在数据一致性需求高于可用性的场合,哨兵模式可能更合适,因为它能够较好地保持主从节点间数据的同步。

在需要处理大量数据并且希望实现水平扩展的场景下,集群模式将是更好的选择。

相关文章:

  • 案例研究|北京交通大学基于DataEase开展多场景校园数据分析与展示
  • 如果在手机没有root的情况下完成安卓手机数据恢复
  • java springboot在测试类中构建虚拟MVC环境并发送请求
  • Jenkins扩展篇-流水线脚本语法
  • 【Python3】【力扣题】338. 比特位计数
  • 设备健康管理平台助力锂电企业实现可持续发展
  • 小程序开通电子发票
  • 手把手教你编写LoadRunner脚本
  • 『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明
  • 【数据结构初阶】栈和队列
  • 机器学习实战-第5章 Logistic回归
  • uniapp开发小程序-如何判断小程序是在手机端还是pc端打开
  • C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)
  • Vue3简单使用(一) --- 环境搭建
  • Autox.js和Auto.js4.1.1手机编辑器不好用我自己写了一个编辑器
  • 《Java编程思想》读书笔记-对象导论
  • ComponentOne 2017 V2版本正式发布
  • CSS中外联样式表代表的含义
  • EventListener原理
  • exports和module.exports
  • HashMap ConcurrentHashMap
  • IP路由与转发
  • java多线程
  • Java基本数据类型之Number
  • 基于组件的设计工作流与界面抽象
  • 记一次删除Git记录中的大文件的过程
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 鱼骨图 - 如何绘制?
  • 正则与JS中的正则
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​flutter 代码混淆
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #{}和${}的区别?
  • #define用法
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ros//EnvironmentVariables)ros环境变量
  • (备忘)Java Map 遍历
  • (状压dp)uva 10817 Headmaster's Headache
  • .CSS-hover 的解释
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Memory Profiler的使用举例
  • .NET MVC之AOP
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET单元测试
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [51nod1610]路径计数
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作