【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试官:不用慌尽管说,错了也没关系。。。来说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令

在这里插入图片描述

面试官:咳咳咳,看你简历写了精通Redis,那我就随便考考你吧


面试官:不用慌尽管说,错了也没关系😊。。。


每日分享大厂面试演练,感兴趣就关注我吧❤️

面试官:我看你们项目用的Redis集群,数据同步了解吗

好的面试官。数据同步主要是利用了RDB文件来进行数据同步。

  1. 首先,从服务器会先向主服务器发送SYNC命令
  2. 收到命令后,主服务器会执行BGSAVE命令来生成一个RDB文件,并使用AOF缓冲区来记录在生成期间执行的写命令
  3. 完成第二步后,主服务器会将RDB文件发送给从服务器,让从服务器同步RDB文件数据
  4. 当然这还没完,主服务器的AOF缓冲区还会发送给从服务器,让它们之间的数据同步至最终状态

在这里插入图片描述


面试官歪了歪脑袋,想了想…


面试官:按你这么说,数据同步后主服务器某个键删除了,数据又不同步了怎么办

噢噢好的。是这样的,Redis有一个叫命令传播的概念。

如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令,发送给从服务器

当从服务执行命令后,数据也就同步了。


面试官想:还知道命令传播,继续深入考你…


面试官:如果主从服务器断线呢?还是用的RDB来同步吗

不是的面试官。用的RDB来数据同步太消耗资源了,比如像CPU、内存、磁盘IO消耗。

如果是短时间断线,根本没有必要使用这么浪费资源的笨方法…

Redis它其实有一个叫PSYNC命令,主从服务器断线后,从服务器会发送一个PSYNC命令给主服务器。收到命令后主服务器会发送给从服务器断线期间执行的写命令

这样从服务器执行命令后,它们的数据也就同步了。这种同步方式也叫部分重同步

在这里插入图片描述


面试官思考中…


面试官:考你点深入些的,主服务器怎么知道断线期间执行了哪些命令呢

emmmmm我想想。

其实每个Redis节点都有维护一个复制偏移量,例如主从服务器的初始偏移量都是0,主服务器发送给从服务器N字节数据,主从服务器的偏移量就会+N。

通过这种形式来记录同步状态。

另外主服务器不是会进行命令传播吗,同时它还会把命令传播的命令保存在一个有复制偏移量标识的复制积压缓冲区队列。

所以从服务器发送PSYNC命令同时发送复制偏移量,主服务器只要根据复制偏移量在队列中找到对应的命令就可以了。


面试官想:可以的小伙子


面试官:你知道服务器运行ID吗

哦哦知道的,每个Redis节点都有自己的服务器运行ID。

当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。

断线后数据同步时,从服务器将向当前连接的主服务器发送之前保存的运行ID

如果此时主服务器发现从服务器发送的运行ID,和自己的不一致。说明此时的主服务器是新的主服务器,它也没有复制积压缓冲区队列,也就不能进行部分重同步

所以此时主服务器会向从服务器发送RDB文件来进行数据同步,服务器运行ID主要是这个作用


面试官有点慌了不知道还能问啥…


面试官:Redis心跳检测知道吧

知道的,面试官。

从服务器默认会每秒一次向主服务器发送命令,如果主服务器超过1s没有收到replconf命令,说明主从服务器的网络连接有问题了。

REPLCONF ACK <replication_offset>

同时这个心跳检测命令还会附带传送一个复制偏移量,也就是replication_offset

如果心跳检测时,主服务器发现他们的复制偏移量不一致,就会通过该偏移量找到从服务器丢失的写命令,发送给从服务器保持同步。

心跳检测也有检测命令丢失的功能。

在这里插入图片描述

面试官抓抓脑袋,继续看你的简历......


得想想考点你不懂的😰

未完待续。。。。。。

好了,今天的分享就先到这,我们下期继续。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
|
9天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
133 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
19天前
|
缓存 NoSQL Java
面试官:Redis如何实现延迟任务?
延迟任务是计划任务,用于在未来特定时间执行。常见应用场景包括定时通知、异步处理、缓存管理、计划任务、订单处理、重试机制、提醒和数据采集。Redis虽无内置延迟任务功能,但可通过过期键通知、ZSet或Redisson实现。然而,这种方法精度有限,稳定性较差,适合轻量级需求。Redisson的RDelayedQueue提供更简单的延迟队列实现。
284 9
|
20天前
|
缓存 NoSQL 定位技术
深入探索Redis:面试中必须掌握的关键知识点
深入探索Redis:面试中必须掌握的关键知识点
|
26天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
32 0
面试官:如何搭建Redis集群?
|
1月前
|
存储 SQL 关系型数据库
【怒怼大厂面试官】你先说说知道哪些MySQL的高级特性
面试官:上一期博客问了你MySQL主从复制,现在考考你MySQL高级特性吧。分区的一个主要目的是将数据按照一个较粗的粒度分在不同的区域,这样的话就有很多好处。
48 1
|
1月前
|
运维 负载均衡 NoSQL
【大厂面试官】知道Redis集群和Redis主从有什么区别吗
集群节点之间的故障检测和Redis主从中的哨兵检测很类似,都是通过PING消息来检测的。。。面试官抓抓脑袋,继续看你的简历…得想想考点你不懂的😰。
67 1
|
30天前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
84 0
|
1月前
|
canal 关系型数据库 MySQL
四种常用的 MySQL 数据同步 ES 的方法
【2月更文挑战第16天】
200 2
四种常用的 MySQL 数据同步 ES 的方法
|
6月前
|
关系型数据库 MySQL Java
对比下 datax 的 OceanBase/MYSQL 不同数据同步方案的效率差异 || 聊聊参数 rewriteBatchedStatements
对比下 datax 的 OceanBase/MYSQL 不同数据同步方案的效率差异 || 聊聊参数 rewriteBatchedStatements