redis,memcached
网络io职责
检测io
io函数本身可以检测io的状态(通过errno),但是只能检测一个fd对应的状态,io多路复用(select)可以同时检测多个io的状态;
这两者的区别是:io函数可以检测具体状态(errno),但io多路复用只能检测出可读,可写,错误,断开等(fd_set)笼统的事件;select返回的错误fd_set可以通过getsockopt()了解具体错误是什么。
操作io
只能使用io函数来进行操作,操作方式分为阻塞io与非阻塞io
阻塞io:如调用read(),就一直在等read()返回,返回后才会执行接下来的代码
非阻塞io:调用read(),不等返回,直接继续执行
阻塞io和非阻塞io
1、阻塞在网络线程(如read()和write())
2、阻塞与非阻塞由连接的fd阻塞属性决定
3、具体差异:io函数在数据未到达时是否立刻返回
设置阻塞或非阻塞
// 默认情况下,fd是阻塞的, 设置非阻塞的方法如下:
int flag = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flag | O_NONBLOCK)
阻塞io模型
非阻塞io模型
io多路复用
io多路复用只负责检测io,不负责操作io
epoll_wait(epfd, evs, sz, timeout);
若timeout = -1;则数据准备阶段永久阻塞
若timeout = 0;则数据准备阶段非阻塞
若timeout = n;(n>0) 则数据准备阶段阻塞timeout时间
epoll结构以及接口
struct eventpoll { // ... struct rb_root rbr; // 管理 epoll 监听的事件 struct list_head rdllist; // 保存着 epoll_wait 返回满⾜条件的事件 // ...
};
struct epitem { // ... struct rb_node rbn; // 红黑树节点 struct list_head rdllist; // 双向链表节点 struct epoll_filefd ffd; // 事件句柄信息 struct eventpoll *ep; // 指向所属的eventpoll对象 struct epoll_event event; // 注册的事件类型 // ...
};
struct epoll_event { __uint32_t events; // epollin epollout epollel(边缘触发) epoll_data_t data; // 保存 关联数据()
};
typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64;
}epoll_data_t;
int epoll_create(int size);
/** op: EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL event.events: EPOLLIN 注册读事件 EPOLLOUT 注册写事件 EPOLLET 注册边缘触发模式,默认是水平触发
*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
/** events[i].events: EPOLLIN 触发读事件 EPOLLOUT 触发写事件 EPOLLERR 连接发生错误 EPOLLRDHUP 连接读端关闭 EPOLLHUP 连接双端关闭
*/
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
epoll原理图:
epoll顺序:
1、调用epoll_create会创建一个epoll对象;
2、调用epoll_ctl添加到epoll中的事件都会与网卡驱动程序建立回调关系;
3、相关事件触发时会调用回调函数(epoll_callback),将触发的事件拷贝到rdlist双向链表中;(前面提到的数据准备阶段就是这个阶段)
4、调用epoll_wait将会把rdlist中就绪事件拷贝到用户态中;
reacotr应用
组成:
io多路复用+非阻塞io
reacotr就是将io的处理转化为对事件的处理
单reactor
reactor的流程:
1、读数据 int n = read(fd, buf,sz);
2、数据解密 cmd, args = decode(buf, sz);
3、逻辑操作 out = logic(cmd, args);
4、数据加密 out = encode(out);
5、发送数据 int n = write(fd, out, sz);
单reactor进行多线程优化:
方法1:将1,2,4,5的处理放到多线程中(若1245为重io操作则可以优化),3的处理放到主线程中
方法2:将1放在主线程处理,2345放在多线程中处理
典型的单reactor:redis(水平触发)
多reactor (one eventloop per thread)
多个epfd即为多reactor(多调用几次epoll_create())
如果资源交互比较少或者临界资源少的话,单reactor比多reactor好用,否则多reactor好。
典型的多线程reactor:memcached(水平触发)
一个master进程fork出多个worker进程,连接的建立是由worker来建立的,worker们监听同一个端口,共享内存中有一把锁,worker进程获取锁,谁拿到锁就由谁来连接和管理这个客户端
典型的多进程reactor:nginx(边沿触发,因为nginx的使用场景不需要处理数据,而是做反向代理,即一收到数据就可以转发,而redis和memcached需要处理数据,所以要接受完所有数据)
redis,memcached相关推荐
- 相比Redis,Memcached真的过时了吗?
下面内容来自Redis作者在stackoverflow上的一个回答,对应的问题是<Is memcached a dinosaur in comparison to Redis?>(相比Re ...
- redis,memcached到nginx,底层网络io中剥离精髓丨C/C++Linux丨C++后端开发丨Linux服务器开发丨底层原理
redis,memcached到nginx,底层网络io中剥离精髓 1. redis单线程网络的优缺点 2. memcached多线程网络的并发优势 3. nginx多进程网络的优势 视频讲解如下,点 ...
- 详解从redis,memcached到nginx,网络底层io
从redis,memcached到nginx,网络底层io的哪些事 1. redis的单线程模型 2. memcached的多线程模型 3. nginx的多进程模型 4. 10种网络模型的应用场景 视 ...
- Redis,MemCached,MongoDB 概述
调研项目主要有Redis. MemCached. MongoDB,以及Amazon的DynamoDB Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key- ...
- 后端开发【一大波有用知识】—Redis,Memcached,Nginx网络组件
reator网络编程 epoll被称为事件管理器,利用管理器去管理多个连接. int clientfd=accept(listenfd,addr,sz); clientfd ==-1 &&am ...
- 谈谈在.NET Core中使用Redis和Memcached的序列化问题
前言 在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去. 序列化这一操作,或许是显式的,或许是隐式的,这个取决于使用的package是否有帮我们做这样一件事. 本文 ...
- memcached客户端_对比Memcached和Redis,谁才是适合你的缓存?
Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...
- 对比Memcached和Redis,谁才是适合你的缓存?
Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...
- redis和Memcached的区别,都什么时候使用?
redis和Memcached的区别,都什么时候使用? 缓存在互联网公司占得比例还是蛮大的,提到缓存呢,就一定会想到redis和memcache,现在绝大多数的公司呢,都是推荐使用redis,这是为什 ...
最新文章
- zabbix-proxy3.0.4编译安装
- Zend Studio 12 windows 无限期试用
- 如何创建字符串(OC)
- 元素的选中问题 元素选中的问题 切换复选框选中 全选和全不选
- P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)
- PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models
- 客户端自动化测试研究
- html弹窗_对付流氓广告弹窗:彻底告别,这一招最有效
- settings.xml的配置
- 【C++】n_element的用法
- Linux基础之常用命令篇
- oracle中查找某用户执行某张表的操作操作记录
- your system apperars to have shutdown uncleanly
- 使用submit异步提交,阻止表单默认提交
- 直播入门(二)从视频采集到客户端播放
- 强化学习的概念及学习过程
- super关键字的用法
- 把数学学好才能画好图形
- Android 开发艺术探索——第十章 Android的消息机制
- 【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering