在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
双线程的程序可以支持每秒几百万的请求量,众所周知,Redis 作为被广泛使用的内存数据库偏偏选择了单线程模型,这又是为什么呢?其实简单概括起来主要有以下三个原因,方便维护,可以并发的处理任务以及双线程不能解决Redis的性能瓶颈。下面我们来仔细分析一下Redis选择单线程模型的原因。

原因一:单线程模型更方便维护
相信我们都了解可维护性对一个项目的重要性,而Redis 使用单线程模型能带来更好的可维护性,方便开发和调试。如果代码难以调试和测试,问题也经常难以复现,这对于任何一个项目来说都会严重地影响项目的可维护性。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,代码的执行过程不再是串行的,多个线程同时访问的变量如果没有谨慎处理就会带来诡异的问题。而多线程带来的问题是很明显的,如果计算机中的两个进程(线程同理)同时尝试修改一个共享内存的内容,在没有并发控制的情况下,最终的结果依赖于两个进程的执行顺序和时机,如果发生了并发访问冲突,最后的结果就会是不正确的。
原因二:可以并发的处理任务。
虽然,Redis选择了单线程模型,但是这也不影响它能并发的处理客户端的请求。Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU。用单线程模型也并不意味着程序不能并发的处理任务,Redis 虽然使用单线程模型处理用户的请求,但是它却使用 I/O 多路复用机制并发处理来自客户端的多个连接,同时等待多个连接发送的请求。在 I/O 多路复用模型中,最重要的函数调用就是 select 以及类似函数,该方法的能够同时监控多个文件描述符(也就是客户端的连接)的可读可写情况,当其中的某些文件描述符可读或者可写时,select 方法就会返回可读以及可写的文件描述符个数。使用 I/O 多路复用技术能够极大地减少系统的开销,系统不再需要额外创建和维护进程和线程来监听来自客户端的大量连接,减少了服务器的开发成本和维护成本
原因三:双线程不能解决Redis的性能瓶颈
这也是Redis选择单线程模型的最核心的原因。虽然多线程技术的能够帮助我们充分利用 CPU 的计算资源来并发的执行不同的任务,但是 CPU 资源往往都不是 Redis 服务器的性能瓶颈。哪怕我们在一个普通的 Linux 服务器上启动 Redis 服务,它也能在 1s 的时间内处理 1,000,000 个用户请求。
如果这种吞吐量不能满足我们的需求,更推荐的做法是使用分片的方式将不同的请求交给不同的 Redis 服务器来处理,而不是在同一个 Redis 服务中引入大量的多线程操作。所以Redis 并不是 CPU 密集型的服务,如果不开启 AOF 备份,所有 Redis 的操作都会在内存中完成不会涉及任何的 I/O 操作,这些数据的读写由于只发生在内存中,所以处理速度是非常快的;整个服务的瓶颈在于网络传输带来的延迟和等待客户端的数据传输,也就是网络 I/O,所以使用多线程模型处理全部的外部请求可能不是一个好的方案。
Redis选择单线程模型的原因分析就讲到这里了,综上所述,Redis选择单线程模型的好处更多,使用双线程其实是完全没有必要的。当然,以上的分析可能已经打破了大家对于单线程的固有印象,因此不是说双线程就一定比单线程好,又结合具体的实际情况来分析。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Static局部变量与全局变量的区别?编译后映射文件是否包含此类变量的地址?
全局变量(外部变量)的说明之前再冠以static 就构成了静 态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整 个源程序, 当一个源程序由多个源文件组成时,非静态的 全局变量在各个源文件中都是有效的。
14248
2019-06-04 11:57:17
Java8有什么变化?九大新特性
Java8有什么变化?本文将讲解Java8的九大新特性,它们分别是Java8Lambda 表达式、Java8方法引用、Java8函数式接口、Java8Nashorn JavaScript Java 8 默认方法、Java8Stream、Java8Optional 类、Java8日期时间API、Java8 Base64。
9190
2019-08-12 10:06:17
Java垃圾回收器相关问题解答
相信很许多人在学习Java的时候,都没有搞清楚过Java垃圾回收器。因此本文主要讲述了Java垃圾回收器的定义、性能评估工具、回收算法等等内容,为大家全面解答垃圾回收器的相关问题。
5647
2019-08-20 15:55:44
Java基础语法之if语句学习笔记
众所周知,流程控制语句可以分为三类,分别是顺序结构、分支结构和循环结构,而分支结构又可以分为if语句和switch语句。顺序结构可以说是程序中最简单最基本的流程控制,这里就不展开详细讲解了。本文重点要讲解分析的是分支结构的if语句,内容包括了if语句的格式、执行流程和具体示例。想要学习Java基础语法的小伙伴,可以看看下面整理的if语句的笔记,希望对大家入门Java能够有所帮助。
7464
2019-12-06 12:40:32
MySQL学习总结之DQL查询语句
DQL查询语句又叫数据库查询语句,这是Java学习者在学习MySQL时,必须了解和掌握的知识点之一。众所周知,DQL查询语句有四种查询方式:排序查询、聚合函数、分组查询和分页查询。下面让我们一一仔细梳理这四种查询方式,有需要学习的小伙伴赶紧来看看MySQL学习总结之DQL查询语句的知识点吧!
5378
2020-02-11 23:24:05
