Redis为什么是单线程的

栏目: IT技术 · 发布时间: 4年前

内容简介:最近在学习首先,现在的除此之外,假设我们的程序有

一、前言

  最近在学习 Redis ,这篇文章就来简单聊聊一道常考的面试题—— Redis 为什么是单线程的。废话不多说,直接开始吧。

二、正文

2.1 为什么需要多线程

  首先,现在的 CPU 一般都是由多个核心组成,每个核心可以认为是一个独立的处理器,它们能够并行地处理任务。所以,如果我们的 CPU 是多核的,但是程序是单线程的,那么执行程序时,这个线程在某一个时刻只能在一个核心上运行,而其它的核心却是空闲的(如果没有其他程序的话)。所以,为了提高 CPU 的使用率,我们可以创建多个线程,每个线程处理任务的一部分(每个部分互不依赖),而每个核心执行一个线程,此时 CPU 的使用率将提高,程序的运行速度自然也就加快了。

  除此之外,假设我们的程序有 A、B、C 三个任务需要执行,但是由于我们的程序使用的是单线程,这些任务只能轮流执行, A 执行完毕只后,才能执行 BB 执行完毕只后,才能执行 C 。这也就意味着,在单线程的环境下,一个新的任务,需要等待它之前的任务执行完毕之后,才能被执行。假设 A 任务是一个非常耗时的任务,那么后面的 B、C 需要等待较长的一段时间,才能被执行,这样的话提交 B、C 任务的用户,需要等待较长的时间,才能得到响应。如果使用的是多线程,那么每个线程被分配到不同的核心上,可以并行地执行;若核心数量不够, CPU 将采用 时间片轮转算法 ,轮流为每一个线程分配时间片执行,这样后续到达的任务,也可以并发地执行,而不需要等待之前任务的完成。此时,后续到达的任务,也可以较早地得到响应,任务的响应速度变得更加均匀。

2.2 如何理解 Redis 的单线程

  这里需要注意一个问题,我们所说的 Redis 的单线程,不是指 Redis 程序真的只会有一个线程。这里所说的单线程,指的是 Redis处理客户端发来的数据操作请求(增删改查),只会使用一个线程去执行 。但是实际上, Redis 在执行其他操作的时候,可能会开启多个进程或线程,比如说持久化。 Redis 执行 BGSAVE 指令,进行快照持久化时,就会 fork 出一个子进程,然后子进程去创建快照,完成持久化操作。

2.3 Redis为什么使用单线程

  官方解释如下: 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了

  上面的解释不是很好理解,我就简单说一说我自己的理解吧。我们知道, Redis 将数据存放在内存当中,这也就意味着, Redis 在操作数据时,不需要进行磁盘 I/O 。磁盘 I/O 是一个比较耗时的操作,所以对于需要进行磁盘 I/O 的程序,我们可以使用多线程,在某个线程进行 I/O 时, CPU 切换到当前程序的其他线程执行,以此减少 CPU 的等待时间。而 Redis 直接操作内存中的数据,所以使用多线程并不能有效提升效率,相反,使用多线程反倒会因为需要进行线程的切换而降低效率。

  有人可能会疑惑,数据是由 CPU 进行处理, Redis 的数据存放在内存中,将内存中的数据读入 CPU 时, CPU 不是依然需要等待吗,为什么不能在等待数据从内存读入 CPU 期间执行其他线程,以此提高 CPU 的使用率呢?这个问题的答案很简单,内存的读写速度虽然比 CPU 慢很多,但是也是非常快的。 CPU 切换线程需要花费一定的时间,而多次切换线程所花费的时间,可能比直接使用单线程执行相同的任务,花费的时间要更多,这是非常不划算的。

  除此之外,使用多线程的话,多个线程间进行同步,保证线程的安全,也是需要开销的。尤其是 Redis 的数据结构都是一些实现较为简单的集合结构,若使用多线程,将会频繁地发生线程冲突,线程的竞争频率较高,反倒会拖慢 Redis 的响应速度。

  综上所述, Redis 为了保持简单和高效,自然而然地就使用了单线程。

2.4 Redis如何提高CPU的使用率

  前面也提过,现在的 CPU 一般都有多个核心,每个核心可以单独执行。 Redis 处理客户端请求使用单线程,那么自然而然,无法将 CPU 的所有核心都占用,也就造成了资源的浪费。而解决的方式也比较简单,我们可以在同一个服务器上开启多个 Redis 程序,每个 Redis 程序使用不同的端口,相互独立,以此提高 CPU 的使用率。而这多个 Redis 程序可以配置成主从节点,共同为一个程序服务,也可以相互独立,服务于多个程序。

三、总结

  以上就对 Redis 为何使用单线程,做了一个大致的介绍,总的来说, Redis 使用单线程的原因就是: 多线程并不能有效提升Redis的性能,相反可能还会降低性能,所以自然而然使用单线程 。希望这篇博客对有需要的人有所帮助 ,若存在错误或者不足,欢迎指正和补充。

四、参考


以上所述就是小编给大家介绍的《Redis为什么是单线程的》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Programming in Java

Introduction to Programming in Java

Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00

By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具