Redis03——Redis架构
时间:2019-09-12
本文章向大家介绍Redis03——Redis架构,主要包括Redis03——Redis架构使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Redis架构
1.1.问题
redis是单线程,单实例,为什么并发那么多,依旧很快呢?
回答:因为调用了系统内核的epoll
1.2.Linux的早期版本
Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。
1.3.内核的跃迁
Linux kernal在之后的发展,有了很大的变化,Linux到达率NIO时期。我们可以使用客户端进行轮询访问。但是,我们如果打进1000个线程访问,那么成本就会很大。我们出现了select函数,select函数和pselect函数,我们可以直接传1000个文件描述符,一旦有返回,那么再去调read函数。这个叫做多路复用的NIO。
紧接着,内核再次跃迁,我们出现了一个共享空间,通过mmap进行空间映射。(本质是红黑树+链表//红黑树是一种自平衡的二叉查找树)。我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取。我们出现了一个epoll函数,它能够处理大量并发连接少量活跃的情况。epoll是同步,非阻塞的多路复用。
科普:
(参考:https://www.jianshu.com/p/444646e02ef7)
I/O:I/O,input output,即磁盘的输入输出。
蔟(sector)和块(block):磁盘驱动的最小单位叫做sector,也叫扇区。对于Linux,虚拟文件系统(VFS)抽象了磁盘设备,统一称为块设备(block device)。
页面缓存(page cache):我们在调用write函数式,会首先写入页面缓存。此时,这个页面叫做脏页面(dirty page),但是,会最终会写回(write back)到内核。如果没有进行write back,那么断电之后,我们就会丢失数据。
mmap:我们的page cache仍然是看不见的,所以,我们通过mmap的映射,可以在应用层直接对page cache进行读写操作。
sendfile:我们可以直接将page cache的fd的一部分数据传给另一个fd,不需要拷贝到应用层的2次copy,所以也被称为零拷贝(zero copy)。
direct I/O:不通过page cache,直接对VFS进行读写,但是在linux2.6之后被废弃
AIO(Asynchronous IO):异步IO,Linux有两套“AIO”接口,仅仅支持磁盘IO,不支持网络IO
POSIX AIO:POSIX AIO用信号通知IO完成了,所以,要先注册一个句柄(handle)。
Linux AIO:第二套IO叫做Linux AIO
这两套接口都有问题,所以周老师说Linux没有AIO,Windows才有(设计问题)
BIO(Blocking IO):阻塞型的,早期Linux,没数据会卡住
NIO(NonBlocking IO):非阻塞型的,没数据直接返回没有数据
IO多路复用(IO Multiplexing):注册一组socket文件描述符给操作系统,如果IO事件发生,交给程序处理。
select:接受指定的文件描述符数组,来读写和异常
poll(译文:轮询):优化select,把读写异常这三个变量变为结构体
epoll:创建一个表,然后用文件描述符指向表,监听表内事件
原文地址:https://www.cnblogs.com/littlepage/p/11515550.html
- 左手用R右手Python系列——任务进度管理
- 左右用R右手Pyhon系列——趣直播课程抓取实战
- 第三周编程作业-Planar data classification with one hidden layerPlanar data classification with one hidden l
- 用R语言照葫芦画瓢撸了一个简易代理~
- 左手用R右手Python——CSS网页解析实战
- R语言数据抓取实战——RCurl+XML组合与XPath解析
- Python网络数据抓取实战——Xpath解析豆瓣书评
- 左手用R右手Python系列17——CSS表达式与网页解析
- 左手用R右手Python系列16——XPath与网页解析库
- 扒一扒rvest的前世今生!
- RCurl中这么多get函数,是不是一直傻傻分不清!!!
- 机器学习(二)深度学习实战-使用Kera预测人物年龄问题描述引入所需要模块加载数据集创建模型编译模型优化optimize1 使用卷积神经网络optimize2 增加神经网络的层数输出结果结果
- 异步加载的基本逻辑与浏览器抓包一般流程
- 左手用R右手Python系列之——表格数据抓取之道
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 前端资源配置教程
- laravel框架语言包拓展实现方法分析
- PHP使用JpGraph绘制折线图操作示例【附源码下载】
- Laravel Eloquent分表方法并使用模型关联的实现
- 关于laravel模板中生成URL的几种模式总结
- Laravel基础-关于引入公共文件的两种方式
- Laravel框架Blade模板简介及模板继承用法分析
- 基于Laravel 多个中间件的执行顺序详解
- 关于laravel 日志写入失败问题汇总
- 确保Laravel网站不会被嵌入到其他站点中的方法
- PHP PDO和消息队列的个人理解与应用实例分析
- tp5 sum某个字段相加得到总数的例子
- laravel框架创建授权策略实例分析
- tp5递归 无限级分类详解
- PHP 进程池与轮询调度算法实现多任务的示例代码