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

相关推荐
流星白龙9 小时前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙9 小时前
【Redis】7.Hash表
数据库·redis·哈希算法
流星白龙10 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
码兄科技10 小时前
实战:基于Spring Boot + UniApp的地理信息小程序开发
spring boot·后端·uni-app
腾讯云云开发12 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
后端
Jelena1577958579212 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
卖买买卖12 小时前
美业收银系统对比分析:系统架构、功能深度与服务模型评估
架构·sass
星栈12 小时前
从装一堆工具到看懂 Node 工程化思维:我的项目复盘记录
后端·node.js
65岁退休Coder12 小时前
LangChain v1.3.4 笔记 - 05 Agent 上下文记忆
后端
颜酱12 小时前
04 | 召回前置准备:搭好召回所需的四个数据库
前端·人工智能·后端