为什么说 Redis 是单线程的?——Java全栈知识(25)

为什么说 Redis 是单线程的?

我们常说的 Redis 是单线程的,但是我前面在讲持久化机制的时候又说 RDB 的持久化是通过主进程 fork 出一个子进程来实现 RDB 持久化。那么 Redis 到底是多线程还是单线程的呢?
Redis 的网络 IO 和键值的读写是单线程完成的。
但是在 Redis4.0 之后,Redis 引入了多线程模型,但是 IO 部分还是由单线程完成,而其他的如持久化存储模块、集群支撑模块等是多线程的。(Redis 6.0 之后将网络 IO 改为了多线程)

[!info]
前面我们讲到的 RDB 持久化,以及 Redis 集群支撑都是基于多线程完成的

1、多线程的好处

多线程的好处在于能够更大程度的利用 CPU 资源以及 IO 资源。
首先 Redis 是否需要提升 CPU 利用?
我们都知道 Redis 是基于内存的数据库,CPU 的资源不是 Redis 的性能瓶颈
所以,通过多线程技术来提升 Redis 的 CPU 利用率这一点是完全没必要的。

那么,使用多线程技术来提升 Redis 的 l/O 利用率呢?是不是有必要呢?
Redis 确实是一个 I/O 操作密集的框架,他的数据操作过程中,会有大量的网络 I/O 和磁盘 I/O 的发生。要想提升 Redis 的性能,是一定要提升 Redis 的 I/O 利用率的,这一点毋膏置疑。
但是,提升 I/O 利用率,并不是只有采用多线程技术这一条路可以走。
image.png|700
Redis 基于 I/O 多路复用来提高 IO 利用率。

2、多线程的坏处

我们都知道 Java 针对并发安全做出了很多的方案。如内存模型、锁、CAS 等,这些者都是 Java 中提供的一些在多线程情况下保证线程安全的技术。
和 Java 类似,所有支持多线程的编程语言或者框架,都不得不面对的一个问题,就是如何解决多线程编程模式带来的共享资源的并发控制问题。
虽然,采用多线程可以帮助我们提升 CPU 和I/O 的利用率,但是多线程带来的并发问题也给这些语言和框架带来了更多的复杂性。而且,多线程模型中,多个线程的互相切换也会带来一定的性能开销。
所以,在提升I/O 利用率这个方法上,Rdis 并没有采用多线程技术,而是选择了多路复用 I/O 技术。

3、Redis 是否需要多线程?

6.0 之前没使用多线程原因:

  1. Redis 是基于内存的, 执行速度非常快,CPU 资源不是瓶颈。
  2. 采用多线程,避免不必要的上下文切换,避免线程不安全的问题。
  3. 采用了 I/O 多路复用,非阻塞式 IO。
    引入多线程的原因:
  4. 随着业务的越来越复杂,Redis 的网络 IO 还是成为了最大的瓶颈。
  5. Redis 6.0 的多线程,只是在处理网络 IO 处使用,在执行命令依然是单线程
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东莞呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值