- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
?
?
Redis设计与实现-客户端服务端与事件
?
?
事件
redis服务器是事件驱动的,事件分为文件事件与时间事件
文件事件是服务器通过套接字与客户端连接,两者之间的通信会产生相应的文件事件,服务器监听并处理这些事件完成网络操作;
时间事件是指redis服务器的定时操作
redis基于reactor模式的文件事件处理器以单线程方式运行,并使用I/O多路复用程序来监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。; 文件事件处理器由四部分组成:
套接字
I/O多路复用程序:监听多个套接字产生的文件事件并放到一个队列,然后以有序同步,每次一个套接字的方式把产生对应事件的套接字传送给文件事件分派器,待事件处理器处理完后再传送下一个;
文件事件分派器:接收I/O多路复用程序传来的套接字,并根据套接产生的事件类型,调用相应的事件处理器处理;
事件处理器:处理具体事件。如命令请求、回复、连接应答等。
如果一个套接字即可读又可写,服务器会先读后写。 时间事件分为定时事件与周期性事件,一个时间事件有3个属性:全局唯一ID、到达时间when、事件处理器timeProc; 服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,遍历此链表,查找已到达的事件并调用相应的事件处理器。 redis服务器变等待处理文件事件,并检查当前是否有已经可以处理的时间事件了,对它们的处理是同步有序原子的,不会中途中断事件处理也不会进行抢占,因此各事件处理器要尽可能地减少阻塞时间。比如写入字节超预设常量大小,命令服务器会主动用break跳出写循环并将余下的数据留到下次再写。
以上文字来自Dimmacro,转载请说明来源:/dimmacro/?
客户端
每个建立连接的客户端,服务端都会为期建立相应的redisClient结构,并追加到redisServer数据机构中用来保存客户端的clients链表中;
客户端一般有三种:
普通通过connect函数连接到服务器,并有连接事件处理器创建的;
Lua脚本伪客户端,服务器初始化时创建并一直存在直到关闭服务器;
AOF伪客户端,执行载入AOF时使用,载入完成后会被关闭
redisClient数据结构中重要的一些属性及说明:
int fd:表示客户端类型,-1表示伪客户端,大于-1表示普通客户端;
name:客户端名字,需要使用CLIENT setname命令设置了才有;
flags:客户端目前所处的状态,如主服务器、正在执行事务、阻塞等多种状态;
sds querybuf:输入缓冲区用于保存客户端发送过来的命令请求,最大不能超过1GB,否则服务器会关闭此客户端;
robj **argv:服务器对命令请求解析后得到的命令及参数,argv[0]表示命令,其他项表示参数
struct redisCommand *cmd:保存该命令对应的实现函数,需要的参数,命令总执行次数及消耗时间等;
保存执行命令所得到的回复结果的输出缓冲区,一个固定大小用于短小的回复,最大16KB,一个可变大小用于大数据量的回复;
int authenticated:身份验证结果,0表示未通过,1表示通过
ctime:客户端被创建的时间戳;
lastinteraction:客户端与服务区最后一次交互的时间;
obuf_soft_limit_reached_time:输出缓冲区第一次达到软性限制的时间
客户端被关闭的几种情况:
客户端进程退出或被杀死;
客户端发送了非法命令请求,被服务端关闭;
客户端处于非主从服务器状态,或阻塞订阅状态,且超过timeout设置的时间时,被服务端关闭;
发送命令请求超过1GB;
命令回复超过输出缓冲区的硬性限制,或超过软性限制时间内一致大于软性限制的大小
?
以上文字来自Dimmacro,转载请说明来源:/dimmacro/?
服务端
redis服务端启动初始化的先后过程:
由redis.c/initServerConfig函数初始化服务器状态结构server(此结构为struct redisServer类型的实例变量),并为结构中的各个属性设置默认值,包括设置服务器的运行ID、运行频率、配置文件路径、运行架构、默认端口号、持久化条件、LRU时钟以及创建命令表等一般属性;
载入用户给定配置参数及配置文件,并对server对应默认属性进行更新;
调用initServer函数为以下数据结构分配内存并根据需要为其设置或管理初始化值:
server.clients链表:记录所有与服务器相连的客户端的状态结构;
serer.db数组:包含所有数据库;
保存频道订阅信息的server.pubsub_channels字典以及保存模式订阅信息的server.pubsub_patter
您可能关注的文档
- Python网络程序设计教学要点与案例分享.docx
- python网络通信器设计.docx
- Python计算生态概览.docx
- Python设计模式面向对象编程.docx
- Python语言程序设计-学习笔记和练习.docx
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- Redis设计与实现-数据结构.docx
- Redis设计与实现-数据结构与对象-第1篇.docx
- Redis设计与实现-数据结构与对象.docx
- Redis设计与实现-第1篇.docx
- Redis设计与实现-第一部分-数据结构与对象-第2章-简单动态字符串.docx
- Redis设计与实现-第一部分-数据结构与对象-第3章-链表.docx
- Redis设计与实现-第一部分-数据结构与对象-第4章-字典.docx
- Redis设计与实现-第一部分-数据结构与对象-第5章-跳跃表.docx
- Redis设计与实现-第一部分-数据结构与对象-第6章-整数集合.docx
- Redis设计与实现-第一部分-数据结构与对象-第7章-压缩列表.docx
文档评论(0)