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

26.Redis主从架构

Redis主从架构

redis主从架构搭建,配置从节点步骤:

1、复制一份redis.conf文件
2、将相关配置修改为如下值:
port 6380
pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件
logfile "6380.log"
dir /usr/local/redis‐5.0.3/data/6380 # 指定数据存放目录
3、配置主从复制
replicaof 192.168.0.1 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读
4、启动从节点
redis‐server redis.conf
5、连接从节点
redis‐cli ‐p 6380
6、测试在6379实例上写数据,6380实例是否能及时同步新修改数据
7、可以自己再配置一个6381的从节点

Redis主从工作原理

1.当为 master 配置了一个 slave 后,无论该 slave 是首次还是非首次连接上 Master,它都会向 Master 发送一个 PSYNC 命令来请求复制数据。

2.Master 在接收到 PSYNC 命令后,会于后台开展数据持久化工作,借助 bgsave 方式生成最新的 rdb 快照文件。

3.在持久化的过程中,Master 依然会继续接纳客户端的请求,并且会把那些有可能对数据集进行修改的请求暂存于内存之中。

4.一旦持久化操作完成,Master 就会将这份 rdb 文件数据集传送给 slave。

5.slave 在接收到数据后,会先将其进行持久化以生成 rdb,随后再加载到自身内存中。之后,Master 会把之前缓存在内存里的命令发送给 slave。

6.当 master 与 slave 之间的连接因某些缘由出现断开情况时,slave 拥有自动重新连接 Master 的功能。要是 Master 接收到了多个 slave 的并发连接请求,它只会进行一次数据持久化操作,并非针对每一个连接都分别进行一次,而后会把这一份持久化后的数据发送给所有并发连接的 slave。

数据部分复制

在 master 和 slave 断开重连后,通常情况下会对整份数据进行复制。然而,自 redis2.8 版本起,redis 开始采用能够支持部分数据复制的命令 PSYNC 来从 master 同步数据,这使得 slave 与 master 在网络连接断开重连后能够仅进行部分数据复制(实现断点续传)。

master 会在自身内存中构建一个用于复制数据的缓存队列,用于存储最近一段时间的数据。同时,master 和它所有的 slave 都维护着复制的数据下标 offset 以及 master 的进程 id。所以,当网络连接断开后,slave 会请求 master 继续尚未完成的复制,从所记录的数据下标处开始。倘若 master 进程 id 发生了变化,或者从节点数据下标 offset 过于陈旧,已经不在 master 的缓存队列中了,那么就会进行一次全量数据的复制。

倘若存在众多从节点,为了缓解主从复制风暴(即多个从节点同时复制主节点从而致使主节点压力过大的情况),可以采用如下架构,即让部分从节点与从节点(已与主节点同步的)同步数据。

Redis Lua脚本

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:

1、减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器 上完成。使用脚本,减少了网络往返时延。这点跟管道类似。

2、原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。管道不是原子的,不过 redis的批量操作命令(类似mset)是原子的。

3、替代redis的事务功能:redis自带的事务功能很鸡肋,报错不支持回滚,而redis的lua脚本几乎实现了常规的事务功能,支持报错回滚操作,官方推荐如果要使用redis的事务功能可以用redis lua替代。 官网文档上有这样一段话:

从Redis2.6.0版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。EVAL命令的格 式如下:


http://www.kler.cn/a/369032.html

相关文章:

  • 【51单片机】第一个小程序 —— 点亮LED灯
  • 【gRPC】什么是RPC——介绍一下RPC
  • 使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
  • 获取微博排行榜PHP
  • 【rabbitmq】rabbitmq工作模式
  • 淘宝商品详情的“侦探游戏”:如何用API接口揭开数据的面纱
  • Hadoop-001-本地虚拟机环境搭建
  • oracle 行转列(PIVOT 多个行数据按照指定的列进行汇总) 列转行(UNPIVOT)
  • RHCE笔记-NFS服务
  • 第十七周:机器学习
  • 2025年软考高级哪个最简单?
  • 重构商业生态:DApp创新玩法与盈利模式的深度剖析
  • c语言中整数在内存中的存储
  • 7、基于爬虫+Flask+Echarts+MySQL的网易云评论可视化大屏
  • 【MySQL】提高篇—数据完整性与约束:主键、外键、唯一约束和检查约束的概念
  • Linux 命令行查看当前目录的总大小/总磁盘空间/磁盘清理
  • Oracle 19c RAC删除多余的PDB的方式
  • Vue 3 对接保利威云点播播放器实践
  • 使用pandas进行数据分析
  • 【Linux】————进程间通信(匿名管道)
  • 数据结构(JAVA)JDK17语法新增特性
  • java spark解决文件读取乱码问题
  • rtp协议:rtcp包格式和传输间隔
  • 【Python】Python面向对象编程进阶:继承、多态与封装
  • 01,http 协议
  • 【开源鸿蒙】OpenHarmony 5.0轻量系统最小开发环境搭建