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:创建一个表,然后用文件描述符指向表,监听表内事件

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网站配置SSL认证的几种方式,https加强网站防护,杜绝DNS拦截

    对于一般网站来说,都会采取第一层CDN网络节点加速来提高网站的访问速度。 以下示例为又拍云CDN(阿里云CDN等也是同样)

    Parker
  • MySQl 事务测试

    5、测试2:当使用read committed的时候,就不会出现脏读的情况了,当时会出现不可重复读的问题

    Parker
  • Hash一致性闭环算法 - ( 适用于Redis扩容、Nginx多级缓存 等等 )

    Redis扩容采用Hash闭环、Nginx多级缓存采用Hash闭环+Lua手动负载器 等等其他需要做扩容的方案

    Parker
  • JavaScript的类型错误:Illegal invocation

    昨一看好像也没什么问题,在IE6~8下运行也没有任何的问题,可是在其它浏览器下就报错了,报了这样一个错:

    meteoric
  • 磁盘IO问题纪录

    随着公司站点的发展,用户和访问量日益增加,经常会出现数据库主从出现延迟的情况,例如,用户在点击充值页进行充值时,经常会出现充值不到账的情况,针对这个问题,对数据...

    dogfei
  • 设计模式——单例模式

    关于单例模式,这是面试时最容易遇到的问题。当时以为很简单的内容,深挖一下,也可以关联出类加载、序列化等知识。

    健程之道
  • 个人认为比较重要的MySQL—innodb参数详解

    innodb_io_capacity:脏页的刷新的数量,可以动态调整,默认是200,该参数的设置取决于硬盘的IOPS的大小,IOPS就是每秒的读写次数。

    小俊丶Eternally
  • 读源码——Guava-Cache

    今天,听同事介绍了Cuava-cache,这是个老牌缓存了,虽然近来被Caffine的出现遮盖了风头,但依然不能掩盖它往日的辉煌,至少在我们团队,还有很多项目在...

    早安嵩骏
  • 深度学习|理解LSTM网络(前篇)

    01 — 回顾 近两天推送介绍了CNN网络,关于这部分的介绍,请参考: 深度学习|卷积神经网络(CNN)介绍(前篇) 深度学习|卷积神经网络(CNN)介绍(后篇...

    double
  • 深度神经网络机器翻译

    2013年,在Brandeis大学聆听薛念文老师(计算语言学领域引用率最高的华人之一, 下图居中, 薛老师右边是好友柏晓鹏和李斌)讨论小组研究语言模型的时候, ...

    史博

扫码关注云+社区

领取腾讯云代金券