Redis中的I/O 多路复用(I/O Multiplexing)
I/O 指的是网络I/O。
多路指的是多个TCP 连接(Socket 或Channel)。
复用指的是复用一个或多个线程。
它的基本原理就是不再由应用程序自己监视连接,而是由内核替应用程序监视文件描述符。
客户端在操作的时候,会产生具有不同事件类型的socket。在服务端,I/O 多路复用程序(I/O Multiplexing Module)会把消息放入队列中,然后通过文件事件分派器(File event Dispatcher),转发到不同的事件处理器中。
多路复用有很多的实现,以select 为例,当用户进程调用了多路复用器,进程会被阻塞。内核会监视多路复用器负责的所有socket,当任何一个socket 的数据准备好了,多路复用器就会返回。这时候用户进程再调用read 操作,把数据从内核缓冲区拷贝到用户空间。
所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪(readable)状态,select()函数就可以返回。
Redis 的多路复用, 提供了select, epoll, evport, kqueue 几种选择,在编译的时候来选择一种。源码ae.c
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
#ifdef HAVE_EPOLL
#include "ae_epoll.c"
#else
#ifdef HAVE_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif
evport 是Solaris 系统内核提供支持的;
epoll 是LINUX 系统内核提供支持的;
kqueue 是Mac 系统提供支持的;
select 是POSIX 提供的,一般的操作系统都有支撑(保底方案);
源码ae_epoll.c、ae_select.c、ae_kqueue.c、ae_evport.c
Redis中的I/O 多路复用(I/O Multiplexing)相关推荐
- Redis:事件驱动(IO多路复用)
目录 § 从Redis的工作模式谈起 § Reactor模式 · C10K问题 · I/O多路复用技术 · Reactor的定义 · Jav ...
- 12.Redis的事件驱动(IO多路复用)
目录 § 从Redis的工作模式谈起 § Reactor模式 · C10K问题 · I/O多路复用技术 · Reactor的定义 · Jav ...
- redis中ziplist,skiplist
ziplist压缩表 ziplist主要是为了节约内存,他将元素存储在一块连续的内存空间中,这样在查询数据的时候也可以利用CPU的缓存访问数据,加快查询的效率 相较于数组而言.我们知道,数组要求每个元 ...
- LRU 算法在 MySQL 和 Redis 中的实现与优化
本文转载于我的个人公众号"阿东编程之路" 一. 什么是LRU算法 LRU 算法全称:Least Recently Used,故名思义就是最近最少被使用的.一般会用 LRU 算法来实 ...
- 函数指针--Nginx和Redis中两种回调函数写法
1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...
- Redis初学:14(Redis中的事务)
Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. Redis事务的主 ...
- Redis中字符串string数据类型(保存(设置键值、过期时间、设置多个键值、追加值)、获取(获取单一键值、获取多个键值))
字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的V ...
- php redis删除所有key,redis中批量删除key的方法
Redis是一个高性能的key-value数据库.redis中可以借助Linux的xargs指令来批量删除key,也可以使用flushdb和flushall命令删除所有key. 批量删除Key Red ...
- redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
转载:https://blog.csdn.net/wab719591157/article/details/73379844 redis 中存数据时,到底什么时候用 hset 相比于 set 存数据 ...
最新文章
- phpstorm 提示请配置PHP解释器的解决办法
- tensorflow教程 开发者指南——评估器 estimator(tensorflow官方推荐使用的编程API)
- 异常处理_月隐学python第19课
- python 识别子串的位置_Python基础语法小白这一篇就足够了!
- Note for Multi Agent Teamwork—A Survey
- 给你一份详细的 Spring Boot 知识清单,史上最全,建议收藏
- java nio 心跳包_请问Java中Socket的心跳包如何实现?
- Log4Cpp 使用实例
- 【协议森林】IPv6过渡技术之隧道和翻译技术
- ubuntu16.04服务器下安装cuda9.0+cudnn7.0+tensorflow1.6.0+Anaconda3
- HCNE之RIP协议总结
- CSOL NST1007 V1.0 完整汉化版发布
- Vulkan同步机制和图形-计算-图形转换的风险(一)
- 我为什么要表扬深信服(转)
- 阿里云短信服务Java实现
- 史上最简单的Linux内核IIO子系统入门demo_内核版本4.4.194
- 哈夫曼树和哈夫曼树编码
- Gazebo机器人仿真
- Java 8 的发展
- 如何预防arp欺骗以及c#如何自动绑定网关的mac地址?
热门文章
- RDS使用只读副本和多AZ的区别在于数据复制的机制
- 读书记:asp.net2.0电子商务开发实战
- Linux 安装json神器 jq
- 一站式学习Redis 从入门到高可用分布式实践(慕课)第六章 Redis开发运维常见问题...
- JavaScript 动态创建标记
- zigbee 协议栈的时钟和定时器分频
- java.io.CharConversionException isHexDigit JS转码问题
- Socket系列3 Socket服务端开发 数据的接收和发送
- Android Studio导入 jar包的方法
- 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)