redisserver启动介绍.pptVIP

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
redisserver启动介绍

1.4.6 注册链接句柄到 event loop 关键性的,initServer() 首先用server 的TCP socket 通过socket的描述符来开始event loop,当一个新的连接被接受的时候,注册acceptHandler()被调用。 1.4.7 打开AOF 如果服务器配置文件中告诉了使用这个的话, initServer() 创建或者打开append-ony-file(AOF) 1.5 back to main() 如果server 被配置为成为守护进程,redis现在将会试着写一个pid文件,这个路径是根据配置文件的,默认情况下面是/var/run/redis.pid。在这一点上,server已经启动了,redis将会把这些写入到日志文件中。然而,要main()全部执行准备好还有一些事情要做。 1.5.1 重建数据 如果有一个AOF文件或者数据库的dump文件,(eg, dump.rdb),它将被载入,重建数据到服务端从一个以前的会话状态(如果两个都存在AOF的优先级更高)。 1.5.2 Event Loop 的建立 最后,redis 注册一个函数用来每次调用进入event loop,beforeSleep()(当进程实际上进入睡眠状态,处于等待接收通知的时候。) beforeSleep()做了两件事,他处理那些服务着客户端那些有请求键被调入了磁盘如果虚拟存储是被允许的情况和它在将AOF写入到磁盘中的时候。写入到AOF文件是通过flushAppendOnlyFile()来处理的。这个函数封装了一些狡猾的逻辑用来将buffer中的数据写入,并且有一些控制写入AOF的参数(写的频率是由用户来决定的) 1.5.3 进入Event Loop Redis现在进入到主的Event Loop通过调用aeMain(),带着参数server.el,记住这个参数包含了一个指向aeEventLoop的指针。如果在任何时候,或者有文件事件通过循环每一次处理的时候,他们的Handler函数将会被调用。aeProcessEvent()封装了这个逻辑-时间事件是像传统的逻辑事件一样被处理的,与之相对应的是用比较重要的epoll或者kpueue或者选择I/O时间监听系统。因为redis需要对时间事件或者文件或者I/O事件进行响应,它应用了一个传统的事件轮询的循环aeMain().通过检查看是否有时间事件要被处理,或者实施文件事件监听,这个事件循环可以很有效的进入睡眠直到有了工作可以来做,并不是一直占用CPU的一个很死的while 循环。 2. 处理命令和返回应答的方式 我们现在在redis的主的Event Loop轮询循环里面,监听了一个端口,并且等待一个客户端连接进来。现在是时候开始关注redis是如何处理一个命令请求的了。 2.1 处理一个新的连接 在initServer()之后,redis注册acceptHandler()这个函数,这个函数在当有I/O事件关联server正在监听的端口的socket的文件描述符(在各个socket等待去读或者写)acceptHandler()创建一个客户端对象,指针指向redisClient,一个结构体在redis.h定义的,用来代表一个新的连接。 2.1 处理一个新的连接 createClient()调用是用来产生和初始化一个client object的。他选择database 0 默认的情况下(由于在每一个的服务端至少有一个redis db),并且与在acceptHandler()中接受的客户端文件的描述符相关联。其他的标志和成员已经初始化好了,并且最终,客户端被加到全局的客户端的链表在server.clients这个末尾。Redis在createClient()做的比较关键的事情注册一个Handler来关联Event Loop,这个函数是readQueryFromClient(),当连接的客户端有数据读入的时候就会调用了。 2.2 从客户端读取命令 readQueryFromClient() 在主的Event Loop循环中被调用,当客户端发出一个命令请求的时候。(如果你正在用GDB debug,这个是一个很好的用来设置断点的函数)。它将命令的内容尽可能多的读入进来,最多1024个字节,到一个临时的buffer,然后将这个加入到一个特殊的查询buffer。这个允许redis处理命令,当有效负载(命令的名字加上参数)超过了1024个字节的时候,或者I/O的原因已经将这个分解为几个读取的事件。它必须调用processInputBuffer(),来传递客户端对象来作为一个参数。当所有的检查通过之后,这个命令将会通过

文档评论(0)

sheppha + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5134022301000003

1亿VIP精品文档

相关文档