<学习笔记> Redis为什么单线程还这么快?

Redis主要因其内存操作、高性能IO模型和单线程模型实现快速响应。虽然主要处理在网络IO和键值对读写上是单线程,但Redis还有其他如持久化、AOF重写等由额外线程处理的功能。单线程避免了上下文切换和锁竞争的开销,简化了系统复杂性,提高了效率。多线程在处理IO密集型任务时能利用CPU空闲时间,提高整体性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis是基于内存操作,CPU不是Redis性能的瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就是使用单线程了,所以就使用单线程了。(狂神redis课)

???听完感觉是:因为这样,所以这样。

640?wx_fmt=jpeg

redis为什么单线程还这么快?

链接1:硬核剖析Redis单线程为什么那么快? - 知乎 (zhihu.com)

看完我的想法是:那多线程上下文切换和访问共享资源会浪费时间,那多线程好在哪?

再看问题:redis单线程为什么那么快,意思是单线程按理说比多线程慢。

Redis是基于内存的,所以快,多线程是在哪执行的?CPU?

链接2:多线程和CPU的关系_百度知道 (baidu.com)

知道了多线程和CPU的关系,CPU早期是单核,并且一次执行完一个线程再执行下一个。现在是多核CPU,一核执行一个线程。但是现在一核可以执行多个线程(看似同时执行)。

在浏览的文章中又看到了并发和并行的概念:

链接3:(147条消息) 并行和并发的区别与联系_暗恋懒洋洋的博客-优快云博客

看完又迷了,为什么单核CPU在执行多个进程的时候要给没个进程分时间片,还要进行上下文切换。这不是脱裤子放屁吗?这样比完成一个进程再完成下一个快在哪?还增加了上下文切换要耗费的时间。

多线程快在哪?

链接4:多线程就一定比单线程快吗? (taodudu.cc)

网上很多关于多线程的文章都会提到IO硬盘的读写问题。这篇文章说:设想一下这样的一个场景,我们现在的程序是单线程的,而且代码中充斥着大量的读取文件内容的操作,而我们知道,硬盘的读写速度与内存差好几个数量级,那么进行 IO 时就不得不阻塞,等待 IO 的完成。那等待 IO 的时候,CPU 在干啥呢?没错,CPU 在发呆,因为我们的程序是单线程的,换句话说,程序是串行执行的,在任何地方发生了阻塞,都将导致无法进行其他任何的工作。

那么IO时CPU为什么在发呆?IO操作在哪执行?

CPU介入IO读取文件吗?

链接5:(147条消息) IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题_MrMoving的博客-优快云博客

看完这篇文章明白了为什么单核CPU要上下文来回切换执行多个线程了。也明白了为什么链接1中最后说为什么Redis6.0引入了多线程了。


沉淀:

1.Redis是单线程还是多线程。

是单线程但是严格说不是。

我们通常说的Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,也可以理解为执行实际命令的处理是单线程的。但 Redis 的其他功能,比如持久化、AOF重写、异步删除、集群数据同步等都是由额外的线程执行的。所以严格来说Redis并不是单线程的。

2.Redis单线程为什么这么快?

Redis的高性能概述主要取决于以下几个方面:

  • 数据在内存中,全部是内存操作
  • 采用高性能IO模型
  • 单线程模型降低额外开销
  • 高效合理的数据结构

Redis采用单线程模型主要考虑的因素:

  • 避免多线程上下文切换的性能损耗
  • 避免访问共享资源加锁的性能损耗
  • 降低系统复杂度,开发可维护性高

3.QPS(Queries-per-second)即每秒查询率

4.并发和并行:

        并发:单核CPU同个上下文切换实现执行多个线程/进程。(看似同时执行多个任务)

        并行:针对多核CPU,有多个线程/进程,每个核心都独立执行一个线程/进程。(真正意义上的同时执行多个任务)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值