Redis主从复制实现原理分析

 更新时间:2025年01月08日 09:23:53   作者:MuseLss  
Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率

Redis主从复制实现原理

Redis 主节点负责写数据,但也有读的权限,redis的从节点只能读。

数据发布到Master节点后,Master节点再把数据同步到slave节点。

实现原理

sync阶段(数据同步)步骤1,2,3,Slave启动会发送sync指令给Master

command propagate阶段(指令传输)2.1,4 , 5

注意:BGSAVE不会阻塞线程,Master依然可以进行写数据,此时数据会把指令写到缓冲区。

但是,如果是网络抖动等情况,从节点恢复也要走上面这套逻辑,显然太过浪费资源。从redis2.8之后,引入了Psync指令代替Sync。Psync会确定要执行全量同步还是部分同步。

  • 全量同步:从节点第一次和主节点建立连接,就会执行sync+command propagate
  • 部分同步:从节点的复制偏移量无法在复制积压缓冲区中找到

注意:如何知道从节点是第一次连接?

Redis在启动的时候会生成一个redis id。

当Master节点和Slave节点第一次连接时,会把redis启动生成的redis id 发给Slave节点,slave节点会对其进行保存。

主从之间发生中断重连的时候,Slave节点会把保存redis id发送给Master节点。

Master节点会判断Slave发过来的id和自己当前的redis id是否一致,一样就说明之前连接过,否则就是第一次连接。

Psync: 2.8版本后

psync会根据从节点的复制偏移量offset,通过心跳发送给主节点,

根据从节点的复制偏移量在主节点找到丢失的数据,

如果主节点的复制积压缓冲区(默认1M)能找到丢失的那部分数据,就执行部分重同步,否则全量重同步.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Windows安装Redis并添加本地自启动服务的实例详解

    Windows安装Redis并添加本地自启动服务的实例详解

    这篇文章主要介绍了Windows安装Redis并添加本地自启动服务的实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 利用yum安装Redis的方法详解

    利用yum安装Redis的方法详解

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。这篇文章主要介绍的是利用yum安装Redis的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧
    2016-11-11
  • redis之数据过期清除策略、缓存淘汰策略详解

    redis之数据过期清除策略、缓存淘汰策略详解

    这篇文章主要介绍了redis之数据过期清除策略、缓存淘汰策略的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 使用Redis快速实现共享Session登录的详细步骤

    使用Redis快速实现共享Session登录的详细步骤

    在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于缓存、消息队列、会话存储等场景,本文给大家介绍了如何使用Redis实现共享Session登录,需要的朋友可以参考下
    2025-08-08
  • 使用Jedis面临的非线程安全问题详解

    使用Jedis面临的非线程安全问题详解

    网上都说jedis实例是非线程安全的,常常通过JedisPool连接池去管理实例,在多线程情况下让每个线程有自己独立的jedis实例,但都没有具体说明为啥jedis实例时非线程安全的,本文就来和大家详细说说
    2022-12-12
  • redis中lua脚本使用教程

    redis中lua脚本使用教程

    在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能。这篇文章主要介绍了redis中lua脚本的简单使用,需要的朋友可以参考下
    2021-10-10
  • 利用Redis的有序集合实现排行榜功能实例代码

    利用Redis的有序集合实现排行榜功能实例代码

    这篇文章主要给大家介绍了关于如何利用Redis的有序集合实现排行榜功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Redis 缓存满了如何解决

    Redis 缓存满了如何解决

    Redis 缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满,本文主要介绍了Redis 缓存满了如何解决,感兴趣的可以了解一下
    2023-08-08
  • Redis自增生成id的方法实践

    Redis自增生成id的方法实践

    在使用Redis时,常常需要用到自增ID的功能,主要介绍了Redis自增生成id的方法实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • RedisTemplate访问Redis的更好方法

    RedisTemplate访问Redis的更好方法

    这篇文章主要为大家介绍了RedisTemplate访问Redis的更好方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论