为什么 Redis 的吞吐量能这么高

性能测试报告

查看了下阿里 Redis 的性能测试报告如下,能够达到数十万、百万级别的 QPS(暂时忽略阿里对 Redis 所做的优化),我们从 Redis 的设计和实现来分析一下 Redis 是怎么做的

Redis 的设计与实现

其实 Redis 主要是通过三个方面来满足这样高效吞吐量的性能需求

  • 高效的数据结构
  • 多路复用 IO 模型
  • 事件机制

高效的数据结构

Redis 支持的几种高效的数据结构 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集 合)

以上几种对外暴露的数据结构它们的底层编码方式都是做了不同的优化的,不细说了,不是本文重点

多路复用 IO 模型

假设某一时刻与 Redis 服务器建立了 1 万个长连接,对于阻塞式 IO 的做法就是,对每一条连接都建立一个线程来处理,那么就需要 1万个线程,同时根据我们的经验对于 IO 密集型的操作我们一般设置,线程数 = 2 * CPU 数量 + 1,对于 CPU 密集型的操作一般设置线程 = CPU 数量 + 1,当然各种书籍或者网上也有一个详细的计算公式可以算出更加合适准确的线程数量,但是得到的结果往往是一个比较小的值,像阻塞式 IO 这也动则创建成千上万的线程,系统是无法承载这样的负荷的更加弹不上高效的吞吐量和服务了。

而多路复用 IO 模型的做法是,用一个线程将这一万个建立成功的链接陆续的放入 event_poll,event_poll 会为这一万个长连接注册回调函数,当某一个长连接准备就绪后(建立建立成功、数据读取完成等),就会通过回调函数写入到 event_poll 的就绪队列 rdlist 中,这样这个单线程就可以通过读取 rdlist 获取到需要的数据

需要注意的是,除了异步 IO 外,其它的 I/O 模型其实都可以归类为阻塞式 I/O 模型,不同的是像阻塞式 I/O 模型在第一阶段读取数据的时候,如果此时数据未准备就绪需要阻塞,在第二阶段数据准备就绪后需要将数据从内核态复制到用户态这一步也是阻塞的。而多路复用 IO 模型在第一阶段是不阻塞的,只会在第二阶段阻塞

通过这种方式,就可以用 1 个或者几个线程来处理大量的连接了,极大的提升了吐吞量

详细的推荐阅读 多路复用 I/O 模型详解, 为什么他能支持更高的并发

事件机制

redis 客户端与 redis 服务端建立连接,发送命令,redis 服务器响应命令都是需要通过事件机制来做的,如下图(来自互联网的某处…)

  1. 首先 redis 服务器运行,监听套接字的 AE_READABLE 事件处于监听的状态下,此时连接应答处理器工作,
  2. 客户端与 redis 服务器发起建立连接,监听套接字产生 AE_READABLE 事件,当 IO 多路复用程序监听到其准备就绪后,将该事件压入队列中,由文件事件分派器获取队列中的事件交于连接应答处理器工作处理,应答客户端建立连接成功,同时将客户端 socket 的 AE_READABLE 事件压入队列由文件事件分派器获取队列中的事件交命令请求处理器关联
  3. 客户端发送 set key value 请求,客户端 socket 的 AE_READABLE 事件,当 IO 多路复用程序监听到其准备就绪后,将该事件压入队列中,由文件事件分派器获取队列中的事件交于命令请求处理器关联处理
  4. 命令请求处理器关联处理完成后,需要响应客户端操作完成,此时将产生 socket 的 AE_WRITEABLE 事件压入队列,由文件事件分派器获取队列中的事件交于命令恢复处理器处理,返回操作结果,完成后将解除 AE_WRITEABLE 事件与命令恢复处理器的关联

reactor模式

大体上可以说 Redis 的工作模式是,reactor 模式配合一个队列,用一个 serverAccept 线程来处理建立请求的链接,并且通过 IO 多路复用模型,让内核来监听这些 socket,一旦某些 socket 的读写事件准备就绪后就对应的事件压入队列中,然后 worker 工作,由文件事件分派器从中获取事件交于对应的处理器去执行,当某个事件执行完成后文件事件分派器才会从队列中获取下一个事件进行处理

可以类比在 netty 中,我们一般会设置 bossGroup 和 workerGroup 默认情况下 bossGroup 为 1,workerGroup = 2 * cpu 数量,这样可以由多个线程来处理读写就绪的事件,但是其中不能有比较耗时的操作如果有的话需要将其放入线程池中,不然会降低其吐吞量。在 redis 中我们可以看做这二者的值都是 1

为什么 Redis 的吞吐量能这么高相关推荐

  1. 【带你重拾Redis】Redis 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 Redis 集群架构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 Redis master 和 sla ...

  2. redis 系列25 哨兵Sentinel (高可用演示 下)

    原文:redis 系列25 哨兵Sentinel (高可用演示 下) 一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS  7.4.17 ...

  3. asp.net core 实战之 redis 负载均衡和quot;高可用quot;实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  4. 缓存数据库面试 - redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?

    缓存数据库面试 - redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis ...

  5. 2021-06-22 19点30 程序外生活 - 中国A50指数 机器预测学习跟踪记录 - 周2白天反弹持续进行,量能不高但平稳,持续反弹概率大,等待顶部信号出现再反向交易,暂多。但周月线持续跌势。

    4小时:周二反弹进行中,但是量能不高,缓慢上涨中,尚还平稳,等待反弹完成,尚无顶部信号出现. 日线级别:反弹进行中,尚无明显结束迹象,有1-3天的可能. 暂多 周线级别:  继续保持下行,注意加速度减 ...

  6. 友盟+高吞吐、极速高并发智能推送服务,赋能值得买科技的精准化用户运营

    ‍ ‍数据智能产业创新服务媒体 --聚焦数智 · 改变商业 经过多年的发展,我国消费电商总体上处于商品溢出.内容溢出的状态.如何提升C端(消费者)和B端(品牌与商家)的连接效率,成为消费电商企业亟需解 ...

  7. redis集群方式及高可用架构

    Redis集群模式 1.主从模式,单台服务器即可,无高可用,为1主2从方式 主节点可读写,从节点只读,数据会从主节点同步至从节点 2.cluster模式 3.0以上版本支持 Redis Cluster ...

  8. 关于Redis的几件事 | 高并发和高可用

    如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了. redis高并发:主从架构,一主多从,一般 ...

  9. redis进程占用CPU很高-达到100

    问题说明: 监控发现,redis进程占用CPU很高-达到100%.并且会有2个redis进程.如下图: 分析了一下,因为redis在持久化保存的时候,会fork出一个进程来.仔细观察进程号PID,会发 ...

最新文章

  1. AndroidManifest.xml文件剖析
  2. linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)
  3. range.clonecontents 不准确_家长注意!通州今起开展幼升小数据调查,不参加或影响明年入学...
  4. JQuery 总结(5) 总结各种小应用
  5. 第13章:项目合同管理(1)-章节重点
  6. [转载]HTTP PUSH技术原理,结合ASP.NET实现以及评述
  7. Minimum Integer
  8. ios html下拉刷新,Lottie_ios 实现下拉刷新
  9. Android Activity/Fragment间的数据传递
  10. RSA key format is not supported
  11. 如何在settings里的休眠模式里添加永不休眠
  12. css样式的属性包括,css字体样式属性有哪些
  13. Smart SVN客户端使用
  14. html音频禁止自动播放,HTML iframe允许音频文件的自动播放无法正常使用
  15. Chrome 浏览器架构
  16. 赵小楼《天道》《遥远的救世主》深度解析(114)时刻要认清自己的本位
  17. 水滴pin安卓版apk_小水滴app下载
  18. 关于HTML中的滚动条
  19. 客户说我已经有合作伙伴了 电话销售如何回应
  20. 一文教你快速学习搭建属于自己的数据指标体系

热门文章

  1. Microbiome: 再论扩增子功能预测分析(Picrust)的效果
  2. 科学养猪的真正奥义,培养拯救人类的医学英雄
  3. Google Chrome插件导出与安装
  4. R语言偏相关或者部分相关性系数计算实战:使用psych包计算(Partial Correlation)偏相关系数、拟合回归模型使用两个回归模型的残差计算偏相关性系数
  5. R语言使用plot函数和lines函数可视化线图(line plot)时、图之间的主要区别是由选项type产生的、type参数常用参数说明、不同type生成的可视化图像对比
  6. R语言ggplot2可视化:在可视化结果图的四个角落(左上、左下、右上、右下)添加标签实战
  7. R语言使用ggplot2包的快速可视化函数qplot绘制散点图(设置数据点的形状、大小)实战
  8. python使用imbalanced-learn的ClusterCentroids方法进行下采样处理数据不平衡问题
  9. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战
  10. R语言画Cox回归森林图