Redis 源码剖析与实战
蒋德钧
中科院计算所副研究员
17747 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
Redis 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

期中测试 | 这些Redis源码知识,你都掌握了吗?

你好,我是蒋德钧。
时间过得真快,从 7 月 26 日上线到现在,我们已经走过了一个半月的学习之旅,不知道你的收获如何呢?
前面我其实也说过,阅读和学习 Redis 源码确实是一个比较烧脑的任务,需要你多花些时间钻研。而从我的经验来看,阶段性的验证和总结是非常重要的。所以在这里,我特别设置了期中考试周,从 9 月 13 日开始到 9 月 19 日结束,这期间我们会暂停更新正文内容,你可以好好利用这一周的时间,去回顾一下前 20 讲的知识,做一个巩固。
有标准才有追求,有追求才有动力,有动力才有进步。一起来挑战一下吧,开启你的期中考试之旅。
我给你出了一套测试题,包括一套选择题和一套问答题。
选择题:满分共 100 分,包含 4 道单选题和 6 道多选题。提交试卷之后,系统会自动评分。
问答题:包括 2 道题目,不计入分数,但我希望你能认真回答这些问题,可以把你的答案写在留言区。在 9 月 16 日这一天,我会公布答案。

选择题

问答题

第一题
Redis 源码中实现的哈希表在 rehash 时,会调用 dictRehash 函数。dictRehash 函数的原型如下,它的参数 n 表示本次 rehash 要搬移 n 个哈希桶(bucket)中的数据。假设 dictRehash 被调用,并且 n 的传入值为 10。但是,在 dictRehash 查找的 10 个 bucket 中,前 5 个 bucket 有数据,而后 5 个 bucket 没有数据,那么,本次调用 dictRehash 是否就只搬移了前 5 个 bucket 中的数据?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Redis源码学习是一项需要耐心和深入思考的任务。本文介绍了作者蒋德钧提出的期中测试,以及测试的内容和形式。测试包括选择题和问答题,涉及Redis源码中的哈希表和事件驱动框架等知识点。通过测试,读者可以检验自己对Redis源码的掌握程度,巩固知识,提升学习能力。文章强调了阶段性验证和总结的重要性,鼓励读者在期中考试周好好利用时间,查漏补缺,快速提升对Redis源码的阅读和学习能力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Redis 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 曾轼麟
    问题一: 应该是只搬运了前5个bucket数据,在函数中会初始化empty_visits为10倍的n,在每次调用改函数的时候最多会遍历10*n个空元素,并且每次只是递减empty_visits,最终当empty_visits为0的时候,方法会直接返回1,结束本次rehash并等待下一次继续,代码如下(返回1代表下次还需要rehash,返回0代表已经完成rehash): int empty_visits = n*10; /* Max number of empty buckets to visit. */ while(d->ht[0].table[d->rehashidx] == NULL) { d->rehashidx++; if (--empty_visits == 0) return 1; } 此外注意到后面也有一个while,其主要的目的就是遍历每个bucket底下的链表,代码如下: de = d->ht[0].table[d->rehashidx]; while(de) { nextde = de->next; ............(此处省略)............ de = nextde; } 问题二: 以epoll为例子 1、epoll_create 对应的调用函数有aeApiCreate,主要是创建epoll的数组最终整体赋值给aeEventLoop中的apidata,在Redis中所有的IO多路复用是封装成了aeApiState的结构体进行调用的。以epoll为例子,在aeApiState中epfd就是epoll的文件描述符数组。 2、epoll_ctl 对应的函数有aeApiAddEvent和aeApiDelEvent,其中aeApiAddEvent主要是将已经创建的socket文件描述符,通过调用epoll_ctl方法交给epoll进行管理。而aeApiDelEvent就是移除或者修改对目标socket的管理。 3、epoll_wait 对应的函数有aeApiPoll,调用epoll_wait后会返回当前已经触发事件(产生了读,写的socket),并将对应的socket文件描述符指针和读写类型掩码mask,记录在fired数组上等待后续IO线程的处理。 整体来说Redis就是通过封装实现了多个aeApixxx方法,从而抽象了各种IO多路复用的方法,并且能按照操作系统类型选择对应的IO多路复用的方式(在宏定义中修改头文件的方式)。
    2021-09-14
    5
  • Milittle
    1. 第一个问题:empty_visits=n*10,空的都跳过,然后打满n个bucket以后,就停止本次rehash,不管empty_visits满不满无所谓。 2. 从上层到底层: ae.c:aeCreateEventLoop->ae_epoll.c:aeApiCreate->epoll_create ae.c:aeCreateFileEvent->ae_epoll.c:aeApiAddEvent->epoll_ctl ae.c:aeMain->aeProcessEvents->ae_epoll.c:aeApiPoll->epoll_wait
    2021-09-14
    2
  • 可怜大灰狼
    1.empty_visits来控制最大空桶访问数,且是10倍n,所以实际访问桶的数量在[5, 55]。2.在初始化Eventloop的时候会调用aeApiCreate,初始化aeApiState,然后调用epoll_create打开epoll文件描述符。aeApiAddEvent新增事件和aeApiDelEvent删除事件调用epoll_ctl来设置epoll_event。aeProcessEvents获取事件通过aeApiPoll来调用epoll_wait
    2021-09-14
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部