首页 > 数据库 >深入理解Redis线程模型

深入理解Redis线程模型

时间:2024-09-13 16:50:29浏览次数:10  
标签:模型 Redis 线程 IO 6.0 CPU

Reids 6.0之前版本的线程模型

在讨论最新版本的Redis的线程模型之前呢,我们先来聊聊原来的Redis的线程模型:

有人说,在6.0之前呢,Redis是单线程的,这么说其实也不太准确,为什么呢?

因为Redis在4.0之后,就引入了多线程,比如说除了处理用户命令的主线程之外,还会起异步的线程去做一些资源释放,清理脏数据,删除大key等工作。

这里我们说之前的Redis是单线程,主要是指原来处理用户命令的线程,是单线程的。那么我们先看看6.0之前的Redis的线程模型图:

 



这就是6.0之前的Redis处理用户命令的主线程的线程模型图,主要过程主要分为:
1、获取可读Socket;
2、读取Socket;
3、解析并执行命令;
4、将结果回写给Socket。

之前为什么会这样设计呢?

据作者自己的说法就是:其实Redis瓶颈往往不在CPU,所以没有必要弄多线程,它的瓶颈往往在内存和网络IO。

    Reids 6.0的线程模型

那么问题来了,在现代互联网应用,对并发性要求越来越高的情况下,如何去解决内存和网络这两个痛点呢?

(1) 对于内存来说,我们可以通过增加内存大小的方式来缓解;

(2) 对于网络来说,Redis作者呢,想到了另外一个办法,就是通过修改Redis的线程模型来对网络IO瓶颈进行缓解。
好了,那么接下来,我们先来看看在6.0版本的Redis,它的线程模型是怎么样的呢?如下


那么这种方式,为什么可以缓解网络IO问题呢?
前面已经讲过,单线程模型下,在高并发情况下,Redis的主线程很多时候,都在进行Socket的读写操作,这块儿其实消耗了很多的CPU等待时间。

但是呢,现代处理CPU一般都是多核架构的CPU,但Redis之前又只能利用一个核,所以单线程的模型限制了Redis的性能发挥。

所以在多核CPU的机器中,我们可以采用多线程(1个主线程+IO线程组)的模式来运行Redis。这样就可以充分利用多核CPU的优势来让Redis的性能得到更好的发挥。

新的问题来了?那么是不是IO线程的数量越多越好呢?

在Redis的配置文件中,有这样两个参数:io-threads-do-reads和io-threads

io-threads-do-reads的默认值是no,也就是说默认情况下,Redis并不会开启多线程模型。如果我要使用Redis的多线程模型,可以将在redis.conf文件中将该值设置为true。

io-threads是用来配置IO线程组线程数。

通常情况下,官方的建议是:如果你的CPU是4核,IO线程组一般设置为2-3;如果你的CPU是8核,IO线程组一般设置为5-6。

为什么官方会这样的去建议呢?那是因为如果IO线程设置太多,那在高并发的情况下,线程的上下文切换会成为新的瓶颈。
             

标签:模型,Redis,线程,IO,6.0,CPU
From: https://www.cnblogs.com/lhrogerluo/p/18412462

相关文章

  • Redis的IO模型
    RedisIO模型RedisIO模型使用的是基于Reactor模式的I/O多路复用模型。这个模型通过单线程事件循环来处理所有的客户端请求和响应。基本模式1.Reactor模式Reactor模式是一种用于处理并发I/O操作的设计模式。它包含以下几个组件:多路复用器(Multiplexer):负责监听多......
  • Whisper 模型在实时语音转录中有哪些具体的应用场景?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 保姆级,手把手教你物理机搭建Redis-sentinel(哨兵)集群
    集群介绍        Redis,作为一种开源的、基于内存的数据结构存储系统,被广泛应用于各种场景,包括缓存、消息队列、短期存储等。单一实例的工作模式通常无法保证Redis的可用性和拓展性,Redis提供了三种分布式方案:主从模式哨兵模式集群模式      主从模式    ......
  • 线程池的拒绝策略
    线程池的拒绝策略是在任务无法被接受执行时,线程池采取的一种处理方式。Java中的ThreadPoolExecutor提供了几种内置的拒绝策略,可以通过构造函数或setRejectedExecutionHandler方法进行设置。以下是常见的拒绝策略:AbortPolicy(默认策略):AbortPolicy是默认的拒绝策略,当任务无法被接受......
  • Java21的虚拟线程来了
    1、什么是平台线程?平台线程是作为操作系统(OS)线程的薄包装器实现的。平台线程在其底层OS线程上运行Java代码,并且平台线程在其整个生命周期内捕获其OS线程。因此,可用的平台线程数量受限于OS线程的数量。平台线程通常具有较大的线程堆栈和由操作系统维护的其他资源。它们......
  • 面试官:线程池遇到未处理的异常会崩溃吗?
    首先,这个问题考察的是你对线程池execute方法和submit方法的理解,在Java线程池的使用中,我们可以通过execute方法或submit方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。1.execute方法execute方法用于提交一个不需要......
  • 深度解析高斯混合模型(GMM)及其在WebRTC VAD中的应用
    目录一、引言二、高斯混合模型概述三、GMM的应用——语音与背景噪声分离四、GMM的训练与优化五、GMM的优势与挑战六、GMM的实际应用案例七、结论八、参考文献一、引言高斯混合模型(GaussianMixtureModel,GMM)是统计学中的一种经典模型,广泛应用于模式识别、聚类和信......
  • Linux字符设备驱动:分层/分离思想、总线设备驱动模型和设备树
    本文章参考韦东山嵌入式Linux应用开发完全手册......
  • Redis高级教程(一)
    Redis数据备份与恢复Redis中SAVG命令用于创建当前数据库的备份语法SAVG命令执行该命令后将会在redis安装目录的src/下创建dump.rdb文件。恢复数据如果恢复数据,要将备份文件(dump.rdb)移动到redis安装目录并启动服务即可(默认备份的目录就在redis安装目录下所以备份后重......
  • 常见的并非模型
    在并行编程中,处理循环迭代时常用的并发模型有几种:WorkerPool(工作池):描述:创建固定数量的工作goroutine,这些goroutine从共享的任务队列中获取任务并执行。优点:控制并发量,避免过多goroutine导致资源耗尽。示例:packagemainimport("fmt""sync")......