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

相关推荐
星空下夜猫子32 分钟前
JAVA 使用POI实现单元格行合并生成
java·开发语言
Flying_Fish_roe33 分钟前
Java中NoSQL 与分布式数据库
java·数据库·nosql
Renascence.4091 小时前
力扣--649.Dota2参议院
java·数据结构·算法·leetcode
VaporGas1 小时前
掌握Java封装:以猜拳小游戏为例,深入理解OOP
java·开发语言·学习·面向对象编程·oop·猜拳游戏·封装思想
小小工匠1 小时前
加密与安全_ sm-crypto 国密算法sm2、sm3和sm4的Java库
java·算法·安全·sm2·sm3·sm4
机智的小神仙儿2 小时前
我是Redis,请看我和mysql是如何交互的吧~
redis·mysql·缓存·交互
程序员大金2 小时前
基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统
java·vue.js·spring boot·后端·mysql·mybatis
陈小唬2 小时前
树形结构构建的两种方式
java·数据库·算法
CJH~2 小时前
Java入门:09.Java中三大特性(封装、继承、多态)01
java·开发语言·单例模式
打工人9962 小时前
反编译app
java