当前位置:首页 >探索 >我们一起聊聊面试被吊打之Redis原理篇 起面试作者单一色调

我们一起聊聊面试被吊打之Redis原理篇 起面试作者单一色调

2024-05-06 17:05:01 [百科] 来源:避面尹邢网

我们一起聊聊面试被吊打之Redis原理篇

作者:单一色调 存储 存储软件 Redis 起面试Redis不同版本之间采用的线程模型是不一样的,在Redis4.0版本之前使用的聊聊理篇是单线程模型,在4.0版本之后增加了多线程的被吊支持。

[[385123]]

本文转载自微信公众号「JAVA日知录」,起面试作者单一色调。聊聊理篇转载本文请联系JAVA日知录公众号。被吊

我们一起聊聊面试被吊打之Redis原理篇 起面试作者单一色调

小张兴冲冲去面试,起面试结果被面试官吊打!

我们一起聊聊面试被吊打之Redis原理篇 起面试作者单一色调

小张:

我们一起聊聊面试被吊打之Redis原理篇 起面试作者单一色调

面试官,聊聊理篇你好。被吊我是起面试来参加面试的。

面试官:

你好,聊聊理篇小张。被吊我看了你的起面试简历,熟练掌握Redis,聊聊理篇那么我就随便问你几个Redis相关的被吊问题吧。首先我的问题是,Redis是单线程还是多线程呢?

小张:

Redis不同版本之间采用的线程模型是不一样的,在Redis4.0版本之前使用的是单线程模型,在4.0版本之后增加了多线程的支持。

在4.0之前虽然我们说Redis是单线程,也只是说它的网络I/O线程以及Set 和 Get操作是由一个线程完成的。但是Redis的持久化、集群同步还是使用其他线程来完成。

4.0之后添加了多线程的支持,主要是体现在大数据的异步删除功能上,例如 unlink key、flushdb async、flushall async 等

面试官:

回答的很好,那为什么Redis在4.0之前会选择使用单线程?而且使用单线程还那么快?

小张:

选择单线程个人觉得主要是使用简单,不存在锁竞争,可以在无锁的情况下完成所有操作,不存在死锁和线程切换带来的性能和时间上的开销,但同时单线程也不能完全发挥出多核CPU的性能。

至于为什么单线程那么快我觉得主要有以下几个原因:

  1. Redis 的大部分操作都在内存中完成,内存中的执行效率本身就很快,并且采用了高效的数据结构,比如哈希表和跳表。
  2. 使用单线程避免了多线程的竞争,省去了多线程切换带来的时间和性能开销,并且不会出现死锁。
  3. 采用 I/O 多路复用机制处理大量客户端的Socket请求,因为这是基于非阻塞的 I/O 模型,这就让Redis可以高效地进行网络通信,I/O的读写流程也不再阻塞。

面试官:

不错,那Redis是如何实现数据不丢失的呢?

小张:

Redis数据是存储在内存中的,为了保证Redis数据不丢失,那就要把数据从内存存储到磁盘上,以便在服务器重启后还能够从磁盘中恢复原有数据,这就是Redis的数据持久化。Redis数据持久化有三种方式。

AOF 日志(Append Only File,文件追加方式):记录所有的操作命令,并以文本的形式追加到文件中。

RDB 快照(Redis DataBase):将某一个时刻的内存数据,以二进制的方式写入磁盘。

混合持久化方式:Redis 4.0 新增了混合持久化的方式,集成了 RDB 和 AOF 的优点。

面试官:

那你分别说说 AOF和 RDB的实现原理吧。

小张:

AOF采用的是写后日志的方式,Redis先执行命令把数据写入内存,然后再记录日志到文件中。AOF日志记录的是操作命令,不是实际的数据,如果采用AOF方法做故障恢复时需要将全量日志都执行一遍。

 

RDB采用的是内存快照的方式,它记录的是某一时刻的数据,而不是操作,所以采用RDB方法做故障恢复时只需要直接把RDB文件读入内存即可,实现快速恢复。

面试官:

你刚提到了AOF采用的是 “写后日志” 的方式,我们平时用的MySQL则采用的是 “写前日志”,那Redis为什么要先执行命令,再把数据写入日志呢?

小张:额头开始冒汗,问的是些啥问题呀。。。

额,这个主要是由于Redis在写入日志之前,不对命令进行语法检查,所以只记录执行成功的命令,避免出现记录错误命令的情况,而且在命令执行后再写日志不会阻塞当前的写操作。

面试官:

那 后写日志又有什么风险呢?

小张:

我... 这个我不会。

面试官:

好吧,后写日志主要有两个风险可能会发生:

数据可能会丢失:如果 Redis 刚执行完命令,此时发生故障宕机,会导致这条命令存在丢失的风险。

可能阻塞其他操作:AOF 日志其实也是在主线程中执行,所以当 Redis 把日志文件写入磁盘的时候,还是会阻塞后续的操作无法执行。

我还有个问题是 RDB做快照时会阻塞线程吗?

小张:

Redis 提供了两个命令来生成 RDB 快照文件,分别是 save 和 bgsave。save 命令在主线程中执行,会导致阻塞。而 bgsave 命令则会创建一个子进程,用于写入 RDB 文件的操作,避免了对主线程的阻塞,这也是 Redis RDB 的默认配置。

面试官:

RDB 做快照的时候数据能修改吗?

小张:

save是同步的会阻塞客户端命令,bgsave的时候是可以修改的。

面试官:

那Redis是怎么解决在bgsave做快照的时候允许数据修改呢?

小张:(你咋还问。。。我™不会啊!)

额,这个我不太清楚...

 

面试官:

这里主要是利用 bgsave的子线程实现的,具体操作如下:

  • 如果主线程执行读操作,则主线程和 bgsave 子进程互相不影响;
  • 如果主线程执行写操作,则被修改的数据会复制一份副本,然后 bgsave子进程会把该副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据。

 

要注意,Redis 对 RDB 的执行频率非常重要,因为这会影响快照数据的完整性以及 Redis 的稳定性,所以在 Redis 4.0 后,增加了 AOF 和 RDB 混合的数据持久化机制: 把数据以 RDB 的方式写入文件,再将后续的操作命令以 AOF 的格式存入文件,既保证了 Redis 重启速度,又降低数据丢失风险。

小张:

学到了学到了。

面试官:

那你再跟我说说Redis如何实现高可用吧?

小张:

Redis实现高可用主要有三种方式:主从复制、哨兵模式,以及 Redis 集群。

主从复制

将从前的一台 Redis 服务器,同步数据到多台从 Redis 服务器上,即一主多从的模式,这个跟MySQL主从复制的原理一样。

 

哨兵模式

使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式(因为哨兵模式做到了可以监控主从服务器,并且提供自动容灾恢复的功能)。

 

Redis Cluster(集群)

Redis Cluster 是一种分布式去中心化的运行模式,是在 Redis 3.0 版本中推出的 Redis 集群方案,它将数据分布在不同的服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能。

 

面试官:

使用哨兵模式在数据上有副本数据做保证,在可用性上又有哨兵监控,一旦master宕机会选举salve节点为master节点,这种已经满足了我们的生产环境需要,那为什么还需要使用集群模式呢?

小张:

额,哨兵模式归根节点还是主从模式,在主从模式下我们可以通过增加salve节点来扩展读并发能力,但是没办法扩展写能力和存储能力,存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力,我们就需要引入集群模式。

面试官:

集群中那么多Master节点,redis cluster在存储的时候如何确定选择哪个节点呢?

小张:

这应该是使用了某种hash算法,但是我不太清楚。。。

 

面试官:

那好,今天的面试就到这里吧,你先回去等我们的面试通知。

小张:

好的,谢谢面试官,你能告诉我redis cluster怎么实现节点选择的吗?

面试官:

Redis Cluster采用的是类一致性哈希算法实现节点选择的,至于什么是一致性哈希算法你自己回去看看。

Redis Cluster将自己分成了16384个Slot(槽位),哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中,具体执行过程分为两大步。

根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值。

再用 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽。

每个Redis节点负责处理一部分槽位,加入你有三个master节点 ABC,每个节点负责的槽位如下:

节点处理槽位
A0-5000
B5001 - 10000
C10001 - 16383

 

这样就实现了cluster节点的选择。

 

责任编辑:武晓燕 来源: JAVA日知录 Redis面试模型

(责任编辑:热点)

    推荐文章
    • 今年全国近八成保障性租赁住房已开工 提高新市民群体满意度

      今年全国近八成保障性租赁住房已开工 提高新市民群体满意度近日,住房和城乡建设部会同国家发改委、财政部、自然资源部、国家税务总局印发了《关于做好2021年度发展保障性租赁住房情况监测评价工作的通知》。《通知》明确,新市民和青年人多、房价偏高或上涨压力较大的大 ...[详细]
    • 怎么让三色灯默认白光

      怎么让三色灯默认白光怎么让三色灯默认白光_齐家问问在接线的时候只需要将电源线直接接到白光上面,那这样打开灯之后默认出现的就是白光,大家可以根据自己的需要来调节光源。三色灯内部带有分段控制,一。三色变光怎么默认白光?在接线 ...[详细]
    • 拉克希尔是什么梗

      拉克希尔是什么梗拉克希尔仪式是什么梗?“拉克希尔仪式”来源于《星际争霸2:虚空之遗》的某一场战役,是用来决定塔达林高阶领主地位的仪式,允许以下克上以实力分胜负。由于《星际争霸2》也是一直主打... ...[详细]
    • 吉祥彩

      吉祥彩前言:吉祥彩是什么吉祥彩当然是人们非常充满着吉祥可爱,五彩缤纷的一种颜色。大家都喜欢和和美美而显得充满着吉祥。吉祥彩怎么样?很不错的,是菲律宾政\\\府指定机构颁发的牌照,很受欢迎的公司。吉祥彩单号最 ...[详细]
    • 险企“补血”渠道有望拓宽 永续债可补充核心二级资本

      险企“补血”渠道有望拓宽 永续债可补充核心二级资本继商业银行永续债后,保险版永续债也要来了。11月21日,北京商报记者获悉,近日,央行联合银保监会起草了《关于保险公司发行无固定期限资本债券有关事项的通知(征求意见稿)》(以下简称《意见稿》),并向社会 ...[详细]
    • 年会节目创意节目

      年会节目创意节目前言:公司年会创意表演有哪些节目可以推荐?2020即将进入尾声,各路行政人事又要开始奔赴年会战场了,员工们也是时候在年会上露一手才艺了。去年的新东方年会上,一首改编的《沙漠骆驼》成功得到俞敏洪校长青睐 ...[详细]
    • 勇敢猪猪不怕困难是什么梗

      勇敢猪猪不怕困难是什么梗加油猪猪梗?猪猪的意思可以是宝贝,加油猪猪就是宝贝加油。猪猪的意思可以是宝贝,加油猪猪就是宝贝加油。最甜的话是猪是什么梗?猪最甜是什么梗?-红网问答最甜的话是猪、猪最甜这个梗来源于“土味情话”,被5岁 ...[详细]
    • 氧气罐能上飞机么

      氧气罐能上飞机么氧气罐能带上飞机吗?求解答_问答库问答氧气罐不能带上飞机的,因为属于易爆物品。但是丽江的超市和小卖铺都有氧气罐卖,玉龙雪山从山下到山上一路都有卖的,所以不需要提前买好。建议在丽江。氧气罐可否上飞机?飞 ...[详细]
    • 鲁西化工(000830.SZ)公布消息:拟开展外汇衍生品交易业务

      鲁西化工(000830.SZ)公布消息:拟开展外汇衍生品交易业务鲁西化工(000830.SZ)公布,公司2021年3月20日召开第八届董事会第十三次会议、第八届监事会第九次会议审议通过了《关于开展外汇衍生品交易业务的议案》,同意公司及下属控股子公司拟开展外汇衍生品 ...[详细]
    • 核桃仁做菜的菜谱

      核桃仁做菜的菜谱核桃做菜的吃法有哪些-九州醉餐饮网核桃可以制作芹菜炒黑木耳核桃仁、木耳山药炒核桃、核桃仁炒韭菜、核桃仁炒虾仁、芹菜炒核桃仁、核桃仁炒西蓝花等美食。使用核桃制作菜肴的时候,将。核桃仁怎么做菜吃和什么菜搭 ...[详细]
    热点阅读