redis如何实现数据同步
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如何实现数据同步的更多相关文章
- redis 学习笔记——数据同步、事务
redis主从同步 redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础. redis复制原理 re ...
- redis与DB数据同步问题
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- Redis和MySQL数据同步及Redis使用场景
1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...
- redis秒杀系统数据同步(保证不多卖)
东西不多卖 秒杀系统需要保证东西不多卖,关键是在多个客户端对库存进行减操作时,必须加锁.Redis中的Watch刚好可以实现一点.首先我们需要获取当前库存,只有库存中的食物小于购物车的数目才能对库存进 ...
- Redis和数据库 数据同步问题
Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...
- redis竞汰数据同步问题解决
Redis 面试的时候遇到过问Redis是如何解决“竞态条件”的,相关知识点总结一下. 乐观锁 所谓竞态条件,举个例子,一个代表点击数的数值hitcount,每个客户点击一次则+1. 没有事务的时候, ...
- Redis与Mysql数据同步
后台定时任务,定时刷新Redis中信息到数据库.(即Job:定时任务)
- Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...
随机推荐
- QT-进制转换计算器
适合初学者练手 用QT做的一个进制转换工具,主要涉及数据类型转换.//后面再加上基本的计算. Github地址:https://github.com/wsdassssss/Calculate.git ...
- springcloud集群测试
使用ribbon实现负载均衡,访问同一个url,轮询不同的服务提供端,从不同的数据库中取数据.
- go socket、http网络编程demo
1.socket通信 服务端接收数据 package main import ( "fmt" "net" "strings" ) func ...
- 1903021116-吉琛- JAVA第二周作业—Java程序编写
项目 内容 课程班级博客链接 19级信计班 这个作业要求链接 https://www.cnblogs.com/thelovelybugfly/p/9641367.html 我的课程学习目标 1. 学习 ...
- Photoshop图片处理在线网页使用无需下载绿色
今天给大家推荐一个ps在线版网页 实测使用效果不错,绿色简介,无需下载,不卡顿一般的电脑配置都可以带起来 因为是在线的所以是精简版的,但是一般ps软件有的工具,功能他都有,比较适合及时性使用 废话不多 ...
- 基于Arcgis Engine 10.2(C#)+PostgreSQL 11(Postgis 3)+pgRouting 3.0实现使用数据库进行路径规划
前言:最近在(被迫)使用ArcGIS Engine10.2(.NET平台)进行二次开发(桌面应用),因为想做一个最短路径查询的功能,而arcgis的网络分析又比较麻烦,于是想到了使用Postgis.但 ...
- XCTF练习题---MISC---normal_png
XCTF练习题---MISC---normal_png flag:flag{B8B68DD7007B1E406F3DF624440D31E0} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是 ...
- 通过代码解释什么是API,什么是SDK?
这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个. 当时我没能说清楚,回去之后就上百度查.结果查了很久还是看不懂,然后就把这个问题搁置了. 谁知道毕业正式工作后,又再一次地面对了这 ...
- CentOS 7 执行 yum 命令失败问题的排查方法
一个执着于技术的公众号 简介 本文主要为大家讲解 CentOS 7系统中执行yum命令失败等常见问题的排查方法. 1.执行yum命令报404错误 1)检查yum仓库是否配置正确,可以到阿里云下载rep ...
- SpringBoot从0到0.7——第一天
SpringBoot从0到0.7--第一天 学习的第一步当然是收拾好心情,先把环境搭建起来,写出第一个helloword出来. 第一步:安装IDEA和Tomcat 我安装的是IDEA 2021.2.2 ...