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的事务控制-基于xml方式

    介绍:该程序模拟了转账操作,即Jone减少500元,tom增加500元 1.导入坐标 <dependency> <groupId>junit</groupId> & ...

  2. 导入,导出excel

    /// <summary> /// 导出数据 /// </summary> /// <param name="XMMC"></param& ...

  3. mysql HikariCP连接池配置

    #连接池配置 #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size spring.datasource.hikari.minimum ...

  4. springboot项目找不到符号问题以及模块聚合项目maven插件使用的相关问题

    问题如图 更换maven,清空缓存重新导入依赖依然无效后 解决方法: 方式一:删除项目中.idea文件夹,重新打开项目,选中jdk版本 ,重新导入依赖即可. 最近又遇到找不到符号问题,本地运行没问题, ...

  5. metasploit基本命令

    一.核心命令 ? 帮助命令 banner 显示一个真棒metasploite横幅 cd 更改当前的工作目 color 切换颜色 connect 连接与主机通信 exit 退出控制台 get 获取特定于 ...

  6. vue 修改单页标题 --- document.title

    方法1. 在需要的组件或者页面内设置 document.title = response.data.res.title 方法2. <head> <meta http-equiv=&q ...

  7. android软件简约记账app开发day09-主页面模块,收支记账信息的展示

    android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...

  8. Android C/C++层hook和java层hook原理以及比较

    作者:Denny Qiao(乔喜铭),云智慧/架构师. 云智慧集团成立于2009年,是全栈智能业务运维解决方案服务商.经过多年自主研发,公司形成了从IT运维.电力运维到IoT运维的产业布局,覆盖ITO ...

  9. 前端架构三大巨头之一Angular | 深度讲解

    云智慧集团成立于2009年,是全栈智能业务运维解决方案服务商.经过多年自主研发,公司形成了从IT运维.电力运维到IoT运维的产业布局,覆盖ITOM.ITOA.ITSM.DevOps以及IoT几大领域, ...

  10. HTML5的基本功能

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...