0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis为何选择单线程

麦辣鸡腿堡 来源:程序员库森 作者:程序员库森 2023-10-09 10:59 次阅读

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 性价比最高的方案。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7553

    浏览量

    88729
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19675
  • Redis
    +关注

    关注

    0

    文章

    374

    浏览量

    10871
收藏 人收藏

    评论

    相关推荐

    Redis7单线程与多线程详解

    主要是指Redis的网络IO和键值对读写是由一个线程来完成的。
    的头像 发表于 01-16 17:33 1846次阅读
    <b class='flag-5'>Redis</b>7<b class='flag-5'>单线程</b>与多<b class='flag-5'>线程</b>详解

    单线程的双任务调度

    STM32是单线程的,通信协议层和应用功能层的耦合性比较低,如果独立运行,提高效率不少,主要实现的方法有哪些呢?
    发表于 01-10 10:15

    单线程SRAM静态内存使用

    概述本篇只要介绍这么使用STM32CubeMx工具添加RT-Thread操作系统组件,码代码的IDE是keil。介绍单线程SRAM静态内存使用。如果还不知道,这么使用STM32CubeMx工具添加
    发表于 08-24 06:57

    一种单线程编程思路简析

    事件驱动?逻辑控制?基于回调的事件驱动或者逻辑控制特点代码接口实现用法基于回调的事件驱动或者逻辑控制本文提供了一种单线程编程思路,并简单实现了该思路。受PLC编程线圈和触点概念的启发。将程序抽象理解
    发表于 02-16 06:58

    线程好还是单线程好?单线程和多线程的区别 优缺点分析

    摘要:如今单线程与多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程和多线程的区别又
    发表于 12-08 09:33 8.1w次阅读

    从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型

    这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。
    的头像 发表于 01-08 16:13 6996次阅读

    阿里云Redis线程性能提升思路解析

    摘要: Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的应用。但是由于redis单进程单线程的模型限制,单Redis Server QPS
    发表于 08-30 16:41 265次阅读

    实现Java多线程爬虫的两点

    在我们调试爬虫程序的时候,单线程爬虫没什么问题,但是当我们在线上环境使用单线程爬虫程序去采集网页时,单线程就暴露出了两个致命的问题:
    的头像 发表于 05-05 21:25 1958次阅读
    实现Java多<b class='flag-5'>线程</b>爬虫的两点

    这款16核怪物在单线程和多线程性能方面均跃居主流处理器榜首

    尽管AMD一段时间以来一直在主流芯片中注入更多的内核,但在单线程性能方面,这家芯片制造商的产品还不能与Intel的产品相提并论。如果这些PassMark号码准确无误,那么Zen 3似乎终于可以轻而易举地获得AMD的青睐。
    的头像 发表于 10-28 15:24 2091次阅读

    Redis常见面试题及答案

    本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程redis
    的头像 发表于 12-16 11:44 2191次阅读
    <b class='flag-5'>Redis</b>常见面试题及答案

    单线程也能开发异步任务?ACE JS框架到底是如何做到的

    HarmonyOS 2提供了两种应用开发语言:Java和JS。Java线程特性能够让多任务并行,充分利用硬件资源开发出高性能的应用。而JS却是一个单线程语言,无法像Java一样创建新的Thread
    的头像 发表于 08-13 17:16 2032次阅读
    <b class='flag-5'>单线程</b>也能开发异步任务?ACE JS框架到底是如何做到的

    Redis基础架构设计及核心网络模型架构演进

    性能优异的服务离不开好的架构设计,Redis使用 I/O multiplexing 实现了单线程接收海量客户端请求;通过单线程Reactor模型实现了高性能的事件处理
    发表于 10-11 15:08 442次阅读

    单线程是否会引起 fail-fast机制

    ConcurrentModificationException 异常,产生 fail-fast 事件。 多线程?并发修改?才会引起 fail-fast 机制保护程序?小 B 觉得这个答案没有说全,面试官说了单线程
    的头像 发表于 10-10 16:31 398次阅读
    <b class='flag-5'>单线程</b>是否会引起 fail-fast机制

    Go在单线程计算性能上的优势

    一文中,我们讨论了Go在单线程计算性能上的优势。 现在,考虑这样的一种场景: 我们需要从某些网址中同步数据并进行计算,保存到本地redis缓存中。 现在,我们可以通过编写Go Worker的方式
    的头像 发表于 11-02 11:16 479次阅读
    Go在<b class='flag-5'>单线程</b>计算性能上的优势

    redis线程还能保证线程安全吗

    Redis是一种使用C语言编写的高性能键值存储系统,它是单线程的,因为使用了多路复用的方式来处理并发请求。这样的实现方式带来了很好的性能,但同时也引发了一些线程安全方面的问题。 在Redis
    的头像 发表于 12-05 10:28 1795次阅读