This commit is contained in:
louzefeng
2024-07-09 18:38:56 +00:00
parent 8bafaef34d
commit bf99793fd0
6071 changed files with 1017944 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
<audio id="audio" title="期中测试题 | 一套习题,测出你的掌握程度" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/38/79/38f6acb1de1d1e6c28fbe8f54293f579.mp3"></audio>
你好,我是蒋德钧。
咱们的课程已经更新过半了,我看到很多同学一直在坚持学习,课程每次更新后,都会认真回答课后题,而且还会分享自己的思考和经验。但是,我也发现,最近有不少同学都掉队了,积累了很多节课都没有学习过。
从今天开始,我们就进入期中周了。我知道,很多同学平时确实比较忙,想等到有了大块的时间再来学习。所以,在刚开始设计课程时,我就特意设置了期中周。巧的是,我们的期中周刚好和国庆黄金周重合了。那么,现在,就是你赶上进度的好机会。
在开始做题之前,我想多说几句。
Redis的知识点比较多而且一旦涉及到性能优化、可靠性保证等需求时我们就需要和进程、线程、内存管理、磁盘IO、网络连接等计算机底层系统知识打交道。如果你不熟悉底层系统的知识在学习Redis时就需要进一步查资料。但是我们平时都很忙可能会来不及查资料过一段时间可能就忘了再想学习时就需要重新了解学习成本比较高。
针对这个问题我想给你分享一下我自己的学习方法。我会用一个word文档或者其他的笔记软件把涉及到的知识点先记录下来。对于那些我没搞清楚的知识点我会把它们标记为红色表明这是一个to-do项。等我有空的时候我就会把这个文档拿出来挨个儿去查看那些标红的知识点查找相关的资料补上知识漏洞。
你可以不要小瞧这个文档,日积月累下来,这就是你的知识宝库。你已经了解的知识点以及还需要进一步学习的知识点,在文档中一目了然。而且,咱们常说“温故而知新”,这个文档就是一个“温故知新”的好材料。
另外,我知道很多同学还有一个疑惑:在学习的时候感觉自己都明白了,但是,真正应用的时候,发现自己又说不清楚或者是想不明白。其实,一个潜在的原因就是,我们对技术点的掌握还不牢固,没有形成自己内在的一套知识体系。
所以,我再给你推荐一个非常有用的学习方法,那就是“**转述**”。每学完一节课之后,就找一个小伙伴,把你学到的内容讲给他/她听。如果对方能听明白,就表示你理解了这些内容。我们自己在讲述内容的时候,潜意识会自动梳理知识点以及它们之间的逻辑关系。当然,你也可以写成一篇文章,如果你发现自己讲不清楚,或者是写不出来,那就代表,你对这些内容的理解有偏差,或者是没有把它们纳入你自己的知识体系。这个时候,你一定要找出来知识盲区,及时在留言区提出来,和我或者是其他小伙伴一起交流讨论。
好了,那话不多说,接下来就准备来自测一下吧。我给你出了一套测试题,包括一套选择题和一套问答题。
- 选择题满分共100分包含15道单选题和5道多选题。提交试卷之后系统自动评分。
- 问答题包括3道题目不计入分数但我希望你能认真回答这些问题可以把你的答案写在留言区。在10月7日这一天我会公布答案。
## 选择题
[<img src="https://static001.geekbang.org/resource/image/28/a4/28d1be62669b4f3cc01c36466bf811a4.png" alt="">](http://time.geekbang.org/quiz/intro?act_id=215&amp;exam_id=662)
## 问答题
### 第一题
Redis在接收多个网络客户端发送的请求操作时如果有一个客户端和Redis的网络连接断开了Redis会一直等待该客户端恢复连接吗为什么
### 第二题
Redis的主从集群可以提升数据可靠性主节点在和从节点进行数据同步时会使用两个缓冲区复制缓冲区和复制积压缓冲区这两个缓冲区的作用各是什么会对Redis主从同步产生什么影响吗
### 第三题
假设在业务场景中我们有20GB的短视频属性信息包括短视频ID、短视频基本信息例如短视频作者、创建时间等要持久化保存并且线上负载以读为主需要能快速查询到这些短视频信息。
现在我们想使用Redis来实现这个需求请你来设计一个解决方案。我来提几个问题你可以思考下。
首先你会用Redis的什么数据类型来保存数据如果我们只用单个实例来运行的话你会采用什么样的持久化方案来保证数据的可靠性
其次如果不使用单实例运行我们有两个备选方案一个是用两台32GB内存的云主机来运行主从两个Redis实例另一个是用10台8GB的云主机来运行Redis Cluster每两台云主机分别运行一个Redis实例主库和从库分别保存4GB数据你会用哪种方案呢请聊一聊你的想法。
好了这节课就到这里。希望你能抓住期中周的机会查漏补缺快速地提升Redis实战能力。我们10月7日见

View File

@@ -0,0 +1,60 @@
<audio id="audio" title="期中测试题答案 | 这些问题,你都答对了吗?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fa/y0/fa0637a18da931665fde2yy77da61yy0.mp3"></audio>
你好,我是蒋德钧。今天,我来公布一下主观题的答案。
### 第一题
Redis在接收多个网络客户端发送的请求操作时如果有一个客户端和Redis的网络连接断开了Redis会一直等待该客户端恢复连接吗为什么
答案:
Redis不会等待客户端恢复连接。<br>
原因是Redis的网络连接是由操作系统进行处理的操作系统内核负责监听网络连接套接字上的连接请求或数据请求而Redis采用了IO多路复用机制epoll不会阻塞在某一个特定的套接字上。epoll机制监测到套接字上有请求到达时就会触发相应的事件并把事件放到一个队列中Redis就会对这个事件队列中的事件进行处理。这样一来Redis只用查看和处理事件队列就可以了。当客户端网络连接断开或恢复时操作系统会进行处理并且在客户端能再次发送请求时把接收到的请求以事件形式通知Redis。
### 第二题
Redis的主从集群可以提升数据可靠性主节点在和从节点进行数据同步时会使用两个缓冲区复制缓冲区和复制积压缓冲区。这两个缓冲区的作用各是什么会对Redis主从同步产生什么影响吗
答案:
首先来说一下复制缓冲区。
**作用:**主节点开始和一个从节点进行全量同步时会为从节点创建一个输出缓冲区这个缓冲区就是复制缓冲区。当主节点向从节点发送RDB文件时如果又接收到了写命令操作就会把它们暂存在复制缓冲区中。等RDB文件传输完成并且在从节点加载完成后主节点再把复制缓冲区中的写命令发给从节点进行同步。
**对主从同步的影响:**如果主库传输RDB文件以及从库加载RDB文件耗时长同时主库接收的写命令操作较多就会导致复制缓冲区被写满而溢出。一旦溢出主库就会关闭和从库的网络连接重新开始全量同步。所以我们可以通过调整client-output-buffer-limit slave这个配置项来增加复制缓冲区的大小以免复制缓冲区溢出。
再来看看复制积压缓冲区。
**作用:**主节点和从节点进行常规同步时,会把写命令也暂存在复制积压缓冲区中。如果从节点和主节点间发生了网络断连,等从节点再次连接后,可以从复制积压缓冲区中同步尚未复制的命令操作。
**对主从同步的影响:**如果从节点和主节点间的网络断连时间过长,复制积压缓冲区可能被新写入的命令覆盖。此时,从节点就没有办法和主节点进行增量复制了,而是只能进行全量复制。针对这个问题,应对的方法是调大复制积压缓冲区的大小(可以参考[第6讲](https://time.geekbang.org/column/article/272852)中对repl_backlog_size的设置
### 第三题
假设在业务场景中我们有20GB的短视频属性信息包括短视频ID、短视频基本信息例如短视频作者、创建时间等要持久化保存并且线上负载以读为主需要能快速查询到这些短视频信息。
现在针对这个需求我们想使用Redis来解决请你来设计一个解决方案。我来提几个问题你可以思考下。
首先你会用Redis的什么数据类型来保存数据如果我们只用单个实例来运行的话你会采用什么样的持久化方案来保证数据的可靠性
另外如果不使用单实例运行我们有两个备选方案一个是用两台32GB内存的云主机来运行主从两个Redis实例另一个是用10台8GB的云主机来运行Redis Cluster每两台云主机分别运行一个Redis实例主库和从库分别保存4GB数据你会用哪种方案呢请聊一聊你的想法。
答案:
Redis的Hash类型属于典型的集合类型可以保存key-value形式的数据。而且当Hash类型中保存较多数据时它的底层是由哈希表实现的。哈希表的存取复杂度是O(1)所以可以实现快速访问。在这道题中短视频属性信息属于典型key-value形式所以我们可以使用Hash类型保存短视频信息。具体来说就是将一个短视频ID作为Hash集合的key将短视频的其他属性信息作为Hash集合内部的键值对例如“作者”:“实际姓名”,“创建时间”:“实际时间”。这样既满足了保存数据的需求也可以利用Hash快速查询的特点快速查到相应的信息。
Redis的AOF日志会记录客户端发送给实例的每一次写操作命令在Redis实例恢复时可以通过重新运行AOF文件中的命令实现恢复数据的目的。在这道题的业务场景中负载以读为主因此写命令不会太多AOF日志文件的体量不会太大即使实例故障了也可以快速完成恢复。所以当使用单实例运行时我们可以使用AOF日志来做持久化方案。
关于使用多实例的运行方案:两种方案各有优势,我们来分析一下。
#### 方案一
优势可以节省云主机数量和成本。虽然主从节点进行第一次全量同步时RDB文件较大耗时会长些但是因为写请求少所以复制缓冲区的压力不大。<br>
不足如果网络环境不好需要频繁地进行全量同步的话这种方案的优势就小了每次全量同步时的RDB生成和传输压力都很大。
#### 方案二
优势每个实例只用保存4GB数据和从库同步时的压力较小。而且这种方案的可扩展性更好如果有新增数据可以更好地应对。<br>
不足:需要较多的云主机,运维和资源成本较高。
好了,这节课就到这里。假期很快就要结束了,希望你抓住最后的几天时间,好好地巩固一下所学的内容。我们下节课见。