Redis为什么是单线程的
一、前言
最近在学习Redis
,这篇文章就来简单聊聊一道常考的面试题——Redis
为什么是单线程的。废话不多说,直接开始吧。
二、正文
2.1 为什么需要多线程
首先,现在的CPU
一般都是由多个核心组成,每个核心可以认为是一个独立的处理器,它们能够并行地处理任务。所以,如果我们的CPU
是多核的,但是程序是单线程的,那么执行程序时,这个线程在某一个时刻只能在一个核心上运行,而其它的核心却是空闲的(如果没有其他程序的话)。所以,为了提高CPU
的使用率,我们可以创建多个线程,每个线程处理任务的一部分(每个部分互不依赖),而每个核心执行一个线程,此时CPU
的使用率将提高,程序的运行速度自然也就加快了。
除此之外,假设我们的程序有A、B、C
三个任务需要执行,但是由于我们的程序使用的是单线程,这些任务只能轮流执行,A
执行完毕只后,才能执行B
,B
执行完毕只后,才能执行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为什么是单线程的的更多相关文章
- Redis为什么是单线程
转自:https://www.zhihu.com/question/23162208 https://www.zhihu.com/question/55818031:加了一些个人的理解. Redis为 ...
- Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- 对Redis 单进程、单线程模型的理解(网摘)
1.基本原理 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) (1)为什么不采用多进程或多线程处理? 多线程处理可能涉及到锁 多线程处理会涉及到线程切换而 ...
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis 到底是单线程还是多线程?我要吊打面试官!
最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...
- Redis为什么是单线程,高并发快的3大原因详解
出处知乎:https://zhuanlan.zhihu.com/p/58038188 Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了 ...
- redis 为什么是单线程的?
一.Redis为什么是单线程的? 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽.既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理 ...
- Redis 是单进程单线程的?
Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销.
- Redis使用单进程单线程方式的优缺点分析
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
随机推荐
- python部署-Flask+uwsgi+Nginx
一.Flask部分(app.py) flask即Python代码:部分参考代码如下,相信很多人如果看到这篇文章一定有flask的代码能力. from app import create_app fro ...
- 这份Java Web必读书单,值得所有Java工程师一看!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,而目前市面上最流行的Jav ...
- matplotlib Transform
2020-04-09 15:09:02 -- Edit by yangray Transform 类是TransformNode的子类,它是所有执行变换的TransformNode的实例的基类.所有非 ...
- 【Java】抽象类、接口
什么是抽象类? 特点: - 抽象类几乎普通类一样,除了不能实例化 - 不能实例化不代表没有构造器,依然可以声明构造器,便于子类实例化调用 - 具有抽象方法的类,一定是抽象类 abstract 抽象的 ...
- svg如何设置中心点进行缩放
中心点设置:x = x+width/2 y=y+height/2缩放开始前后需要变换对应的位置,直接举例:<rect x="110" y="100" ...
- Python中赋值、浅拷贝和深拷贝的区别
前言文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http: ...
- 抠脚大叔如何改变性别,Python实现变声器功能
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- 代理模式是什么?如何在 C# 中实现代理模式
代理模式 并不是日常开发工作中常常用到的一种设计模式,也是一种不易被理解的一种设计模式.但是它会广泛的应用在系统框架.业务框架中. 定义 它的 定义 就如其它同大部分 设计模式 的定义类似,即不通俗也 ...
- Flutter 步骤进度组件
老孟导读:最近文章更新拖后腿了,一直忙着网站改版的事情,今天总算落地了,全新的Flutter网站即将上线,敬请期待.网站目前收集197个组件的详细用法,还有150多个组件待整理. Stepper S ...
- IOC趣味理解
假设一个场景: 假设你是一个四岁孩子,饿了,想吃东西.怎么做? 1,哪有吃的去哪拿,你知道冰箱有吃的,你去冰箱拿〉会有风险.比如,拿了生的吃的,吃坏肚子,甚至拿了不能吃的东西. 2, 找父母(IO ...