Redis为何选择单线程

redis为何选择单线程?
在redisv6.0以前,redis的核心网络模型选择用单线程来实现。
核心意思就是,对于一个 db 来说,cpu 通常不会是瓶颈,因为大多数请求不会是 cpu 密集型的,而是 i/o 密集型。
具体到 redis的话,如果不考虑 rdb/aof 等持久化方案,redis是完全的纯内存操作,执行速度是非常快的,因此这部分操作通常不会是性能瓶颈,redis真正的性能瓶颈在于网络 i/o,也就是客户端和服务端之间的网络传输延迟,因此 redis选择了单线程的 i/o 多路复用来实现它的核心网络模型。
实际上更加具体的选择单线程的原因如下:
避免过多的上下文切换开销:如果是单线程则可以规避进程内频繁的线程切换开销,因为程序始终运行在进程中单个线程内,没有多线程切换的场景。
避免同步机制的开销:如果 redis选择多线程模型,又因为 redis是一个数据库,那么势必涉及到底层数据同步的问题,则必然会引入某些同步机制,比如锁,而我们知道 redis不仅仅提供了简单的 key-value 数据结构,还有 list、set 和 hash 等等其他丰富的数据结构,而不同的数据结构对同步访问的加锁粒度又不尽相同,可能会导致在操作数据过程中带来很多加锁解锁的开销,增加程序复杂度的同时还会降低性能。
简单可维护:如果 redis使用多线程模式,那么所有的底层数据结构都必须实现成线程安全的,这无疑又使得 redis的实现变得更加复杂。
总而言之,redis选择单线程可以说是多方博弈之后的一种权衡:在保证足够的性能表现之下,使用单线程保持代码的简单和可维护性。
redis真的是单线程?
讨论 这个问题前,先看下 redis的版本中两个重要的节点:
redis 4.0(引入多线程处理异步任务)
redis 6.0(正式在网络模型中实现 i/o 多线程)
所以,网络上说的redis是单线程,通常是指在redis 6.0之前,其核心网络模型使用的是单线程;而redis的异步任务使用的仍是多线程。
redis在 4.0 版本的时候就已经引入了的多线程来做一些异步操作,此举主要针对的是那些非常耗时的命令,通过将这些命令的执行进行异步化,避免阻塞单线程的事件循环。
在 redis 4.0 之后增加了一些的非阻塞命令如 unlink、flushall async、flushdb async。
redisv6.0为何引入多线程?
很简单,就是 redis的网络 i/o 瓶颈已经越来越明显了。
随着互联网的飞速发展,互联网业务系统所要处理的线上流量越来越大,redis的单线程模式会导致系统消耗很多 cpu 时间在网络 i/o 上从而降低吞吐量,要提升 redis的性能有两个方向:
优化网络 i/o 模块
提高机器内存读写的速度
后者依赖于硬件的发展,暂时无解。所以只能从前者下手,网络 i/o 的优化又可以分为两个方向:
零拷贝技术或者 dpdk 技术
利用多核优势
零拷贝技术有其局限性,无法完全适配 redis这一类复杂的网络 i/o 场景,更多网络 i/o 对 cpu 时间的消耗和 linux 零拷贝技术。而 dpdk 技术通过旁路网卡 i/o 绕过内核协议栈的方式又太过于复杂以及需要内核甚至是硬件的支持。
因此,利用多核优势成为了优化网络 i/o 性价比最高的方案。

降低微型减速电机啮合噪音的方法
基于区块链完全去中心化的Mesh网络协议MTC介绍
喜报丨联诚发(LCF)荣获“广东知名品牌”
盘点2022财年日本主要自动化厂商业绩状况:基恩士表现亮眼!
关于RT-AK开源轻松实现一键部署AI模型至RT-Thread解析
Redis为何选择单线程
五个提高物联网设备安全性的工具
上海雷卯推出DFN1006超小体积网口保护ESD ULC0342P26LV
苹果系列配件促销活动将在这周结束,没尝到甜头的小伙伴们抓紧咯!
一个新兴的电化学储能产业分支赛道——便携式储能
计算机组成原理65分攻略
华为今年底或将推新平板:采用12.9英寸OLED屏
基于TMS37157的低频收发器MCU接口方案
国内碳化硅衬底生产企业盘点
2018手机CPU大起底:苹果A12很强,联发科P60很弱
Lantiq推出业界首款G.fast家庭网关参考设计
松下动力电池材料革新路径
用LED光在家种菜全过程图集
APS计划排产软件推动灯具照明行业生产精益化
一文详解ADC模拟数字转换器
s