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

Redis03——Redis架构的更多相关文章

  1. Redis --> Redis架构设计

    Redis架构设计 一.前言   Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列 ...

  2. 如何搭建高可用redis架构?

    如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...

  3. Redis架构演变与redis-cluster群集读写方案

    导言 redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案.本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(Master.slave可进行写读分 ...

  4. 细说分布式Redis架构设计和踩过的那些坑

    细说分布式Redis架构设计和踩过的那些坑_redis 分布式_ redis 分布式锁_分布式缓存redis 细说分布式Redis架构设计和踩过的那些坑

  5. Redis架构之哨兵机制与集群

    Redis架构之哨兵机制与集群 哨兵机制 1.介绍: Sentinel(哨兵)是redis高可用性解决方案:由一个或多个由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个 ...

  6. [转载] Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=208733458&idx=1&sn=691bfde670fb ...

  7. Memcached 及 Redis 架构分析和比较

    Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放 ...

  8. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  9. Memcached 及 Redis 架构分析和区别比较

    Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放 ...

随机推荐

  1. rocksdb wiki文档阅读笔记

    由于是英文文档,不做笔记过一阵就忘了,现在把关键点记录到这,开发的时候使用. 具体wiki地址:https://github.com/facebook/rocksdb/wiki 1)Column Fa ...

  2. Es性能优化

    1. Es中10亿级别的数据量,如何提高查询效率 (1) 性能优化关键:file system cache a. 不要期待随手挑一个参数,就可以万能的应对所有性能慢的场景 b. es依赖于底层的fil ...

  3. jQuery之替换节点

    如果要替换节点,jQuery提供了两个方法:replaceWith()和replaceAll(). 两个方法的作用相同,只是操作颠倒了. 作用:将所有匹配的元素都替换成指定的HTML或者DOM元素.( ...

  4. 【VS开发】组播(多播)的C程序实战

    每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂. 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不 ...

  5. vscode setting.json (@vue/eslint-config-prettier)

    {     "workbench.colorTheme": "Default Light+", // 主题     "terminal.integra ...

  6. Vue-cli3性能优化

    Vue-cli3.0的打包性能优化方案:https://juejin.im/post/5d42962be51d4561b84c00c3 提升90%加载速度——vuecli下的首屏性能优化:https: ...

  7. JSP基础知识补充

    <meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Cac ...

  8. python-第五章习题

    5.2 def isOdd(x): if(x%2==0): return False return True x=eval(input("")) print(isOdd(x)) 5 ...

  9. Vue--理解非prop特性

    所谓非 prop 特性,就是指它可以直接传入组件,而不需要定义相应的 prop. 尽管为组件定义明确的 prop 是推荐的传参方式,组件的作者却并不总能预见到组件被使用的场景.所以,组件可以接收任意传 ...

  10. 初识numpy库

    numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型.多维数组上执行数值运算 numpy创建数组(矩阵): numpy中的数据类型: ...