
Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
(学习视频分享:redis视频教程)
文件事件处理器
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

消息处理流程
文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件的套接字都推到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字:当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕), I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。
I/O 多路复用程序的实现
Redis的I/O多路复用程序的所有功能是通过包装select、epoll、evport和kqueue这些I/O多路复用函数库来实现的,每个I/O多路复用函数库在Redis源码中都对应一个单独的文件,比如ae_select.c、ae_epoll.c、ae_kqueue.c等。
因为Redis为每个I/O多路复用函数库都实现了相同的API,所以I/O多路复用程序的底层实现是可以互换的,如下图所示。

有关epoll的详细讲解,可以点击查看,彻底搞懂epoll高效运行的原理
Redis在I/O多路复用程序的实现源码中用#include宏定义了相应的规则,程序会在编译时自动选择系统中性能最好的I/O多路复用函数库来作为Redis的I/O多路复用程序的底层实现:
/* Include the best multiplexing layer supported by this system.
* The following should be ordered by performances, descending. */
#ifdef H*E_EVPORT
#include "ae_evport.c"
#else
#ifdef H*E_EPOLL
#include "ae_epoll.c"
#else
#ifdef H*E_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif文件事件的类型
I/O 多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件,这两类事件和套接字操作之间的对应关系如下:
当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行connect操作),套接字产生AE_READABLE 事件。
当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITABLE事件。I/O多路复用程序允许服务器同时监听套接字的AE_READABLE事件和AE_WRITABLE事件,如果一个套接字同时产生了这两种事件,那么文件事件分派器会优先处理AE_READABLE事件,等到AE_READABLE事件处理完之后,才处理AE_WRITABLE 事件。这也就是说,如果一个套接字又可读又可写的话,那么服务器将先读套接字,后写套接字。
文件事件的处理器
Redis为文件事件编写了多个处理器,这些事件处理器分别用于实现不同的网络通讯需求,常用的处理器如下:
为了对连接服务器的各个客户端进行应答, 服务器要为监听套接字关联连接应答处理器。
为了接收客户端传来的命令请求, 服务器要为客户端套接字关联命令请求处理器。
乐活途购物分享社区
beta v1.1版本为第一个版本,简单的整合了基础功能,各位站长拿到程序后,不要纠结后台的功能简单,后续将不断更新扩展。在beta v1.1版本使用过程中遇到什么问题,请登录 www.loftto.com 进行反馈! 安装说明######重要提醒:程序不支持二级目录安装,请使用一级目录或二级目录绑定!#第一步,确定你的服务器支持PHP+mysql。#第二步,确定你的服务器开启了gd库。#第三步,
0
查看详情
为了向客户端返回命令的执行结果, 服务器要为客户端套接字关联命令回复处理器。
连接应答处理器
networking.c中acceptTcpHandler函数是Redis的连接应答处理器,这个处理器用于对连接服务器监听套接字的客户端进行应答,具体实现为sys/socket.h/accept函数的包装。
当Redis服务器进行初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联起来,当有客户端用sys/socket.h/connect函数连接服务器监听套接字的时候, 套接字就会产生AE_READABLE 事件, 引发连接应答处理器执行, 并执行相应的套接字应答操作,如图所示。

命令请求处理器
networking.c中readQueryFromClient函数是Redis的命令请求处理器,这个处理器负责从套接字中读入客户端发送的命令请求内容, 具体实现为unistd.h/read函数的包装。
当一个客户端通过连接应答处理器成功连接到服务器之后, 服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求的时候,套接字就会产生 AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作,如图所示。

在客户端连接服务器的整个过程中,服务器都会一直为客户端套接字的AE_READABLE事件关联命令请求处理器。
命令回复处理器
networking.c中sendReplyToClient函数是Redis的命令回复处理器,这个处理器负责将服务器执行命令后得到的命令回复通过套接字返回给客户端,具体实现为unistd.h/write函数的包装。
当服务器有命令回复需要传送给客户端的时候,服务器会将客户端套接字的AE_WRITABLE事件和命令回复处理器关联起来,当客户端准备好接收服务器传回的命令回复时,就会产生AE_WRITABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作, 如图所示。

当命令回复发送完毕之后, 服务器就会解除命令回复处理器与客户端套接字的 AE_WRITABLE 事件之间的关联。
一次完整的客户端与服务器连接事件示例
假设Redis服务器正在运作,那么这个服务器的监听套接字的AE_READABLE事件应该正处于监听状态之下,而该事件所对应的处理器为连接应答处理器。
如果这时有一个Redis客户端向Redis服务器发起连接,那么监听套接字将产生AE_READABLE事件, 触发连接应答处理器执行:处理器会对客户端的连接请求进行应答, 然后创建客户端套接字,以及客户端状态,并将客户端套接字的 AE_READABLE 事件与命令请求处理器进行关联,使得客户端可以向主服务器发送命令请求。
之后,客户端向Redis服务器发送一个命令请求,那么客户端套接字将产生 AE_READABLE事件,引发命令请求处理器执行,处理器读取客户端的命令内容, 然后传给相关程序去执行。
执行命令将产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的AE_WRITABLE事件与命令回复处理器进行关联:当客户端尝试读取命令回复的时候,客户端套接字将产生AE_WRITABLE事件, 触发命令回复处理器执行, 当命令回复处理器将命令回复全部写入到套接字之后, 服务器就会解除客户端套接字的AE_WRITABLE事件与命令回复处理器之间的关联。

相关推荐:redis数据库教程
以上就是为什么说redis是单线程的的详细内容,更多请关注其它相关文章!
# 又可
# 阳春建设网站
# 网站建设页面优化建议
# 沧州网站推广哪家便宜
# 岳麓网站优化
# 谷歌网站建设教程分享
# 宁波鄞州区网站优化好吗
# 襄樊seo外包
# 留坝县编办网站建设
# 义乌seo电话
# 高埗定制网站建设
# redis
# 如图所示
# 要为
# 会将
# 多个
# 就会
# 复用
# 多路
# 客户端
# 单线程
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
苹果如何下载nanobanana
《爱南宁》认证电动车方法
win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】
MacBook Pro词典使用指南
J*aScript装饰器_元编程实战
解决Pandas DataFrame高度碎片化警告:高效创建多列的策略
j*a中ArrayBlockingQueue的使用
Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法
sublime怎么在文件中显示代码结构大纲_sublime符号列表功能
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
京东快递物流信息不更新怎么办_物流停滞原因与处理方法
多多买菜门店端app订单查看方法
mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程
Apple Music无故扣费引质疑
纯CSS实现自适应宽度与响应式布局的水平按钮组
J*aScript与HTML元素交互:图片点击事件与链接处理教程
PHP多语言网站的实现:会话管理与翻译函数优化教程
微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
MongoDB聚合管道:高效统计列表中各项的文档数量
铁路12306官网入口 铁路12306中国铁路官网登录首页
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程
Bootstrap 5导航栏折叠功能失效:数据属性迁移指南
《搜书吧》阅读书籍方法
漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程
《图怪兽》退出登录方法
《宝可梦大集结》S4冠军之路开始时间介绍
电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】
j*a中赋值运算符是什么?
t3出行如何使用微信支付
抖音团长模式怎么做?团长模式是什么意思?
AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例
《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略
获取WooCommerce产品在后台编辑页面的分类ID
如何查找哪个composer包引入了特定的依赖?
胃动力不足?试试这5个调理方法
c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践
喜茶GO更换登录账号方法
学习通网页版课程打不开_课程无法访问时的解决方法
Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】
惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置
Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】
暴风影音官网正式版_暴风影音手机版官网下载安卓
在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
如何在CSS中设置背景图像:一个全面指南
在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程
优化 WooCommerce 产品价格显示与自定义短代码集成
《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊
2021-01-11
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。