redis如何实现数据同步
两种,1全同步,2部分同步
全备份:
在slave启动时会向master发送sync消息,master收到slave这条消息之后,将启动后台备份进程,备份完成之后,将备份数据发送给slave
全备份机制
1.slave向master发送SYNC指令,master接收到该指令,调用syncCommand()函数进行处理
2.在syncCommand函数中,启动一个备份进程用于数据同步,如果已有备份进程,就不再重新启动
3.备份进程将执行rdbSave(),完成将redis全部数据保存为rdb文件
4.在redis时间事件函数serverCron中,校验备份进程是否检查完毕,如果备份完成,则调用backgroundSaveDoneHandler完成后续操作
5.在backgroundSaveDoneHandler中更新master各种状态,如备份成功或失败,备份时间等,然后调用updateSlavesWaitingBgsave,将备份的rdb数据发送给等待的slave
6.在updateSlavesWaitingBgsave中遍历所有等待同步的slave,将rdb文件发送给每一个slave,并不是立即发送数据给slave,而是等slave注册写事件及响应函数sendBulkToSlave,当slave对应的socket能够发送数据时就调用sendBulkToSlave
7.sendBulkToSlave将备份文件发送给slave

  数据修改操作同步
首次启动全同步,运行过程中进行更新操作(包括写、删除、更改操作)的同步,选一个单独的slave进行数据备份操作
修改操作机制
1.master接收到用户操作,将调用call函数执行的具体操作函数,在call中先通过proc执行函数操作,然后判断该操作是否需要扩散到各slave,如果需要则调用函数propagate()来执行
2.propagate函数将操作指令记录到aof中并扩散到slave,在propagate中调用feedAppendOnlyFile将操作指令记录到aof中,并通过replicationFeedSlaves将操作扩散到各个slave中
3.feedAppendOnlyFile主要将操作保存到aof中,在该函数中将操作转换为redis内部协议格式,并以字符串的形式存储,追加到aof中
4.replicationFeedSlaves将操作扩散到每一个slave中,首先遍历每一个slave,对每个slave执行以下操作,将slave切换到本操作对应的数据库(根据数据库id和当前数据id判断),写入切换数据库的命令时将调用addReply;将命令和参数按照redis协议格式写入到slave响应缓存中.写入命令和参数时将调用addReplyMultiBulkLen和addReplyBulk,这两个函数最终也将调用addReply
5.在函数addReply中将调用prepareClientToWrite,设置slave的socket写入事件处理函数sendReplyClient(通过aeCreateFileEvent设置),这样一旦slave对应的socket有空间写入数据,就调用sendReplyClient进行处理
6.sendReplyClient主要功能是将slave中药发送的数据通过socket发出去

redis如何实现数据同步的更多相关文章

  1. redis 学习笔记——数据同步、事务

    redis主从同步      redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础.   redis复制原理      re ...

  2. redis与DB数据同步问题

    Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...

  3. Redis单节点数据同步到Redis集群

    一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...

  4. Redis和MySQL数据同步及Redis使用场景

    1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...

  5. redis秒杀系统数据同步(保证不多卖)

    东西不多卖 秒杀系统需要保证东西不多卖,关键是在多个客户端对库存进行减操作时,必须加锁.Redis中的Watch刚好可以实现一点.首先我们需要获取当前库存,只有库存中的食物小于购物车的数目才能对库存进 ...

  6. Redis和数据库 数据同步问题

    Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...

  7. redis竞汰数据同步问题解决

    Redis 面试的时候遇到过问Redis是如何解决“竞态条件”的,相关知识点总结一下. 乐观锁 所谓竞态条件,举个例子,一个代表点击数的数值hitcount,每个客户点击一次则+1. 没有事务的时候, ...

  8. Redis与Mysql数据同步

    后台定时任务,定时刷新Redis中信息到数据库.(即Job:定时任务)

  9. Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

    mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...

随机推荐

  1. Spring Boot-@PropertySource注解

    @PropertySource:加载自己手动编写的资源文件 有关@ConfigurationProperties注解的作用请访问Spring Boot-@Value获取值和@Configuration ...

  2. IOH和MCH(北桥芯片的变化)

    IOH位置架构图示意图 北桥芯片-MCH和北桥芯片-IOH区别 1.MCH是内存控制器中心的英文缩写,负责连接CPU,AGP总线和内存, 目前Intel的CPU已经把内存控制器(北桥芯片-MCH)总线 ...

  3. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  4. 日志、第三方模块(openpyxl模块)

    目录 1.日志模块 2.第三方模块 内容 日志模块 1.日志模块的主要组成部分 1.logger对象:产生日志 无包装的产品 import logging logger = logging.getLo ...

  5. VScode链接服务器并配置公钥-SSH Keys

    VScode链接服务器并配置公钥-SSH Keys 一直在用Xshell做SSH连接服务器与虚拟机,但是中文乱码的问题一直找不到解决方案,干脆使用编辑器自带的插件,集成之后用起来也方便 1.概述 做法 ...

  6. docker进阶_docker-compose

    Docker-compose 为什么使用docker-compose 官方介绍 ​ Compose 是一个用于定义和运行多容器 Docker 应用程序的工具.使用 Compose,您可以使用 YAML ...

  7. 【职场必备】6个免费良心网站&职场办公网站(收藏血赚)

    1.随机自动生成头像的网站:https://www.tool22.com/Tools-SJTX.html2.迅捷PDF转换器:https://app.xunjiepdf.com/3.全网音乐下载:① ...

  8. i2c调试工具分享

    i2c-tools简介 在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具--i2c-tools. i2c-tool ...

  9. Halo 开源项目学习(二):实体类与数据表

    基本介绍 Halo 项目中定义了一些实体类,用于存储博客中的关键数据,如用户信息.文章信息等.在深入学习 Halo 的设计理念与实现过程之前,不妨先学习一下一个完整的博客系统都由哪些元素组成. 实体类 ...

  10. [AcWing 36] 合并两个排序的链表

    点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L ...