Redis是基于内存操作,CPU不是Redis性能的瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就是使用单线程了,所以就使用单线程了。(狂神redis课)
???听完感觉是:因为这样,所以这样。
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,有多个线程/进程,每个核心都独立执行一个线程/进程。(真正意义上的同时执行多个任务)