Redis到底是多线程还是单线程?

这篇具有很好参考价值的文章主要介绍了Redis到底是多线程还是单线程?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis 是单线程的!

        Redis 是非常的快的!Redis 是基于内存操作,CPU 不是 Redis 性能瓶颈,内存和网络带宽(因为 IO 时需要使用)才是 Redis 的性能瓶颈。

Redis 为什么不使用多线程?

        因为在多线程的情况下,CPU会在多个线程之间切换(上下文切换)是需要耗时的,大概为 1500 ns 左右,在频繁的线程切换下,就会非常影响效率。而使用单线程可以不用切换,使得 Redis 在单线程的情况下效率是最高的。

总结:对于内存系统来说,如果没有上下文切换效率就是最高的!

官方答复:

  • 使用 Redis 时,几乎不存在 CPU 成为瓶颈的情况, Redis 主要受限于内存和网络。

  • 在一个普通的 Linux 系统上,Redis 通过使用pipelining 每秒可以处理 100 万个请求,所以如果应用程序主要使用 O(N) 或O(log(N)) 的命令,它几乎不会占用太多 CPU。

  • 使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

Redis 6.0 为啥要引入多线程?

随着硬件性能提升,Redis 的性能瓶颈可能出现网络 IO 的读写,也就是:单个线程处理网络读写的速度跟不上底层网络硬件的速度

读写网络的 read/write 方法在系统调用中占用了 Redis 执行期间大部分CPU 时间,瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:

  • 提高网络 IO 性能。典型的实现比如使用 DPDK 来替代内核网络栈的方式。
  • 使用多线程充分利用多核,提高网络请求读写的并行度。典型的实现比如 Memcached

而第一种替代内核网络战的方式实现起来成本太高。需要将 Redis 源码中和网络相关的部分修改,以支持新的网络协议。

所以,Redis 官方采用多个 IO 线程来处理网请络求,提高网络请求处理的并行度,来提高在网络 IO 方面的速度。

需要注意的是,Redis 多 IO 线程模型只用来处理网络读写请求,对于 Redis 的读写的核心命令,依然是单线程处理

随着互联网的飞速发展,互联网业务系统所要处理的线上流量越来越大,Redis 的单线程模式会导致系统消耗很多 CPU 时间在网络 I/O 上从而降低吞吐量,要提升 Redis 的性能有两个方向:

  • 优化网络 I/O 模块
  • 提高机器内存读写的速度

后者依赖于硬件的发展,暂时无解。所以只能从前者下手,网络 I/O 的优化又可以分为两个方向:

  • 零拷贝技术或者 DPDK 技术
  • 利用多核优势

前者成本太高,需要改动 Redis 网络部分的很多代码。

后者的开发成本低,提高明显。并且在 Redis 的超高效率下(不会占用很多的 CPU 资源),也没必要用前者这么复杂的改动方式去再减少 CPU 的占用。文章来源地址https://www.toymoban.com/news/detail-429118.html

到了这里,关于Redis到底是多线程还是单线程?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

    前面我们了解了什么是进程以及如何实现进程调度,那么今天我将为大家分享关于线程相关的知识。在学习线程之前,我们认为进程是操作系统执行独立执行的单位,但其实并不然。线程是操作系统中能够独立执行的最小单元。只有掌握了什么是线程,我们才能实现后面的并

    2024年02月09日
    浏览(49)
  • 什么是多线程环境下的伪共享(false sharing)?

    在Java中,伪共享(false sharing)是指多线程环境下,由于缓存一致性协议的影响,不同线程访问同一缓存行中的不同数据造成的性能下降现象。当多个线程同时访问不同变量,但这些变量存储在同一缓存行中时,每个线程只修改自己的变量,但由于缓存一致性协议的要求,需要将

    2024年02月10日
    浏览(37)
  • 到底叫 集合还是数组还是list还是列表?

    1 总体上可以将数据结构分为数组和集合两种,而列表是一个泛指 2 数组 -- 有序的,但长度是固定的-元素数量固定并且需要频繁访问,那么使用数组可能更合适 3 集合 3.1 list  -- 支持添加和删除元素,或者元素的数量不确定,就可以使用List类型 3.2 set -- Set是一种不允许重

    2024年02月14日
    浏览(38)
  • 到底是前端验证还是后端验证

          软件应用研发中, 前端验证还是后端验证这是意识与认知问题。鉴于某些入门同学还不清楚,我们再来看下: 一.  从软件行业来自国外 Q: 前端验证和后端验证都是对同一个数据的验证,有什么区别? A: 二者的目的不同: 前端验证是为了提供更好的用户体验; 后端

    2024年02月04日
    浏览(53)
  • Midjourney中文版到底是官方还是李鬼?

    AI绘画大神Midjourney为何选择QQ频道进军中国市场? Midjourney中文版到底是官方还是李鬼?看这篇文章就知道了! 今天我想和大家聊聊一个最近很火的话题,那就是AI绘画神器Midjourney(简称MJ)来中国了,QQ频道内测火爆开启。这对于喜欢AI绘画的创作者来说,无疑是一个福音,

    2024年02月12日
    浏览(44)
  • 事务到底是隔离的还是不隔离的 (具体)

    下面是一个只有两行的表的初始化语句 mysql CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; insert into t(id, k) values(1,1),(2,2);            这里,我们需要注意的是事务的启动时机。         begin/start transaction 命令并不是一个事务的起点,在

    2024年02月14日
    浏览(43)
  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展,AI绘画已经成为一个非常热门的领域。AI绘画的应用范围非常广泛,它对于设计、摄影等领域产生了积极影响,但同时,由于AI绘画的版权究竟归属于谁,AI绘画也引起了版权的争议。那么,AI到底是创造艺术还是窃取艺术呢?本文将对此进行探讨。 一、

    2024年02月15日
    浏览(35)
  • POSTGRESQL PERPARE 事务提交方式,到底用还是不用

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1100人左右 1 + 2 + 3)新人会进入3群 关于Prepare 提交事务的方式问题,有两

    2024年02月16日
    浏览(44)
  • C语言中到底是非0表示真,还是1表示真?

    我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重点说一说C语言中到底是非0表示真,还是1表示真?这就是说到C语言中的两个常见运算形式,即关系运算符和逻辑运算符。 为照顾急性子的同学,先直接说结论: 关系运算符和逻辑运算符用“真”和“假”表示运算

    2024年02月04日
    浏览(55)
  • STM32初学者,到底选标准库还是HAL库?

    当初学者尝试学习STM32开发时,通常会面临一个关键的选择:是选择STM32的标准库,还是HAL库?这两个库各自有着优势与适用场景,本文将从多个角度分析,帮助初学者更好地选择适合自己的库。 在开始之前,让我们先搞清楚这两个库的基本概念。标准库是一组用于STM32系列微

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包