当前位置: 首页 > news >正文

为什么Redis6.0引入了多线程?

2020年5月份,Redis正式推出了6.0版本,这个版本中有很多重要的新特性,其中多线程特性引起了广泛关注。

但是,需要提醒大家的是,Redis 6.0中的多线程,也只是针对处理网络请求过程采用了多线程,而数据的读写命令,仍然是单线程处理的。

但是,不知道会不会有人有这样的疑问:

Redis不是号称单线程也有很高的性能么?

不是说多路复用技术已经大大地提升了IO利用率了么,为什么还需要多线程?

主要是因为我们对Redis有着更高的要求。

根据测算,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理80,000到100,000 QPS,这么高的对于80%的公司来说,单线程的Redis已经足够使用了。

但随着越来越复杂的业务场景,有些公司动不动就几亿的交易量,因此需要更大的QPS。

为了提升QPS,很多公司的做法是部署Redis集群,并且尽可能提升Redis机器数量。但是这种做法的资源消耗是巨大的。

而经过分析,限制Redis的性能的主要瓶颈出现在网络IO的处理上,虽然之前采用了多路复用技术。但是到目前为止,多路复用的IO处理本质上仍然是同步阻塞型IO模型

在多路复用的IO模型中,在处理网络请求时,调用select(其他函数同理)的过程是阻塞的,也就是说这个过程会阻塞线程,如果并发量很高,此处可能会成为瓶颈。

虽然现在很多服务器配备多个CPU核的,但是对于Redis来说,因为使用了单线程,在一次数据操作的过程中,有大量的CPU时间是用来耗在了网络IO的同步处理上的,并没有充分的发挥出多核的优势。

如果能采用多线程,使得网络处理的请求并发进行,就可以大大的提升性能。多线程除了可以减少由于网络I/O等待造成的影响,还可以充分利用CPU的多核优势。

所以,Redis 6.0采用多个IO线程来处理网络请求,网络请求的解析可以由其他线程完成,然后把解析后的请求交由主线程进行实际的内存读写。提升网络请求处理的并行度,进而提升整体性能。

但是,Redis的多IO线程只是用来处理网络请求的,对于读写命令,Redis仍然使用单线程来处理。

那么,在引入多线程之后,如何解决并发带来的线程安全问题呢?

这就是为什么我们前面多次提到“Redis 6.0的多线程只是用来处理网络请求,而数据的读写还是单线程”的原因。

Redis 6.0只有在网络请求的接收和解析,以及请求后的数据通过网络返回给时,使用了多线程。而数据读写操作还是由单线程来完成的。所以,这样就不会出现并发问题了。


http://www.mrgr.cn/news/9284.html

相关文章:

  • JavaEE从入门到起飞(九) ~Activiti 工作流
  • Git入门 -- 分支
  • 基于carsim的线控转向仿真(2)--齿条力观测
  • OpenCV详细介绍
  • 链表OJ题——环形链表2
  • STM32GPIO引脚八种工作模式
  • C/C++语言基础--字符串(包括字符串与字符数组、字符串与指针、字符串处理函数等),代码均可运行
  • SPSS和MATLAB实现【典型相关分析】
  • 如何通过 JavaScript 实现点击按钮下载
  • python如何进行debug
  • 服务启动方法LINUX
  • k8s跨节点后pod无法访问
  • Unity滚滚车轮计划 之 新输入系统控制2D角色移动动画(俯视)
  • 墨者学院Oracle靶场通关
  • 【STM32实物】基于STM32设计的计算器——程序源码设计文档实物图设计文档等(文末完整资料下载)
  • Linux系统编程:TCP,UDP协议特点,粘包,wireshark抓包
  • 如何简单判断某个port是否被防火墙block
  • python——requests
  • 【服务器】VirtualBox+Centos+Docker的安装
  • 2-71 基于matlab的小波分析在心电信号去噪中的应用