单机数据库的实现(下)

事件

redis服务器是一个事件驱动程序,主要处理两类事件:文件事件和时间事件。

文件事件

文件事件处理器使用I/O多路复用的程序来同时监听多个套接字,虽然redis的文件事件处理器以单线程方式运行,但通过io多路复用监听多个套接字,这样实现了高性能的网络通讯模型,又可以很好地让redis以单线程的方式运行,保持了单线程设计的简单性。(这是redis单线程还能那么快的原因之一)

文件事件的构成

由四个组成部分:套接字,io多路复用程序,文件事件分派器以及事件处理器。

image-20200825161924824

当套接字变得可读(客户端对套接字执行write操作或者执行close操作)的时候,或者有新的可应答套接字出现时,套接字产生AE_READABLE事件。

当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITABLE事件。

  • 一次完整的连接通讯流程是怎么样子的?

假设一个redis服务器正在运作,这个时候服务器的监听套接字的AE_READABLE事件处于监听情况下。

这时有个redis客户端向服务器发起连接,那么监听套接字将产生AE_READABLE事件,触发连接应答处理器执行。

连接处理器应答之后会创建客户端套接字,客户端状态,并将客户端套接字的AE_READABLE事件与命令请求处理器进行关联。

然后假设客户端向主服务器发送一个命令请求,那么客户端套接字将产生AE_READABLE事件,引发命令请求处理器执行,处理器读取相关的命令内容,传给相关的程序执行。

之后命令会产生相关的恢复,为了将这个回复给客户端,服务器会将客户端套接字的AE_WRITABLE事件与命令回复处理器关联。当客户端尝试读取命令回复的时候,客户端套接字会产生AE_WRITABLE事件,触发命令回复处理器执行,当命令回复处理器将命令回复全部写入到套接字后,服务器就会解除客户端 套接字的事件和关联。

image-20200825182326976

时间事件

redis的时间事件是用周期性事件(让一个程序每隔指定时间就执行一次)

主要有三个属性组成,id(唯一标识号),when(时间事件的到达时间),timeProc(时间事件处理函数)

  • 那具体是怎么实现的?

redis服务器将所有的时间事件都放在一个无序列表中,事件执行器会去遍历这些节点,如果发现时间到达,就会执行对应的时间事件。

  • 这样实现不会很耗费资源吗?

不会 ,因为redis的时间事件很少,正常模式下只有serverCron一个事件。

  • serverCron函数是干嘛的?

主要工作有:

  1. 更新服务器的各类统计消息,比如时间,内存占用,数据库占用等。
  2. 清理数据库中的过期键值对。
  3. 关闭和清理链接失效的客户端。
  4. 尝试进行AOF或RDB持久化操作。
  5. 如果服务器是主服务器,那么对服务器进行定期同步。
  6. 如果处于集群模式,对集群进行定期同步和连接测试。

调度

  • 因为服务器存在文件事件和时间事件,他们是怎么调度执行的?

很简单,ae.c/aeProcessEvents负责,如果有时间事件要处理,就不阻塞去处理时间事件,如果没有时间时间,会阻塞一下,来等待文件事件,然后执行文件事件,执行时间事件,然后不停死循环执行。

客户端

redis保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,其中包括:

  • 客户端的套接字描述符(伪客户端是-1,在aof恢复用到,否则大于1,每个客户端都是唯一的)。
  • 客户端的名字。(通过setname设置)
  • 客户端的标识符。(标识客户端的角色(从服务器,微客户端)和客户端的状态(执行monitor命令等))
  • 客户端正在使用的数据库的指针,已经该数据库的号码。
  • 客户端当前要执行的命令,命令的参数,命令参数的个数,以及指向命令实现函数的指针。(从缓存区分析的到的命令内容)
  • 客户端的输入缓冲区和输出缓冲区。(缓存了客户端的命令以及服务端的输出)
  • 客户端的复制状态信息,以及进行复制所需的数据结构。
  • 客户端执行BRPOP,BLPOP等列表阻塞命令时使用的数据结构。
  • 客户端的事务状态,以及执行WATCH命令时用到的数据结构。
  • 客户端执行发布与订阅功能用到的数据结构。
  • 客户端的身份验证标志。
  • 客户端的创建时间,最后一次通信时间。

是通过链表把多个客户端状态记录到服务器中。

  • 客户端的关闭时机是什么时候?
  1. 客户端退出。
  2. 客户端发送了不符合协议内容的数据。
  3. 服务端调用CLIENT KILL
  4. 服务端设置了timeout配置,那么客户端空转太长就会被关闭。
  5. 客户端的命令大小超过1G。
  6. 输出缓冲区大于限制大小会被关闭。

服务器

命令执行器是如何工作的?

命令执行器首先根据argv[0]的值,在命令表中找到对应的redisCommand对象。

这个对象记录了命令相关的细节,比如允许参数多少,实现函数指针,对该命令的标识符,以及一些统计信息。

image-20200826114220363

服务器先利用这些对命令进行检查,如果检查失败了,则返回一个错误,如果打开了监视器,就会把要执行的命令和参数等消息发给监视器。

检查完毕之后,就调用执行命令的相关函数,得到回复之后会保存在客户端状态的输出缓冲区里面。

执行结束之后还有一些特殊任务,有统计慢查询,修改链接的统计信息,aof写入到AOF缓冲区里面,复制命令到其它从服务器。

最后套接字变为可写状态的时候,把输出缓冲区里面的数据返回给客户端。

  • serverCron函数详细作用?
  1. 更新缓存服务器的lruclock时钟,算每个key的lru值并不是实时的,而是这个值减去每个key的lru的值。
  2. info中的一些统计信息。
  3. 处理sigterm信号,在退出redis之前做相关的操作,比如RDB持久化。
  4. 关闭无用客户端连接。
  5. 抽查部分key,并删除过期的部分key。
  6. 将延迟的FGREWRITEAOF执行。
  7. 将AOF缓冲区的内容写入AOF文件。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352