首页 > 编程知识 正文

为什么说redis不是单线程(Redis为什么这么快?Redis的线程模型与Redis多线程)

时间:2023-05-06 18:38:42 阅读:122080 作者:1878

一、Redis有多快? Redis是一个基于内存的高性能K-V数据库,官方提供的测试报告可以单独支持约10w/s的QPS

(二、Redis为什么这么快?(1) )完全基于内存,数据存在于内存中,大部分要求是纯内存操作,速度非常快,与传统的磁盘文件数据存储相比,来自磁盘IO

)2)数据结构简单,数据操作也简单。 Redis的数据结构是专门设计的,每个数据结构都支持一个或多个数据结构。 Redis依赖于这些灵活的数据结构来提高读写性能。

)3)单线程大大减少了上下文切换时间和CPU消耗,消除了竞争条件,无需考虑各种锁定问题,消除了解锁操作,也消除了死锁带来的性能消耗。

(4)可以使用基于IO复用机制的线程模型来处理同时链路。

Redis基于Reactor模式开发了自己的网络事件处理器。 此处理器称为文件事件处理器文件事件处理程序。 由于该文件事件处理器是单线程的,因此Redis被称为单线程模型,但使用I/o复用机制同时接收多个套接字,并根据套接字上的事件选择对应的事件处理器进行处理。 文件处理器的结构由四个部分组成,线程模型如下图所示。

多个套接字io复用程序文件事件调度程序事件处理器(命令请求处理器、命令响应处理器、连接响应处理器) )。

多个套接字可能生成不同的操作,每个操作对应一个不同的文件事件,但IO复用器接收多个套接字,对套接字上生成的事件进行排队,事件调度程序从队列中逐个检索事件,然后

Redis客户端经过三个过程:在每次服务端调用时发送命令、执行命令和返回结果。 其中,在执行命令的阶段,Redis通过单线程处理命令,因此到达服务端的所有命令都不会立即执行,而是所有命令都在一个队列中,一个个执行。 此外,多个客户端发送的命令的执行顺序是不确定的。 但是,确认了两个指令不会同时执行,不会产生同时执行的问题。 这就是Redis的单线程基本模型。

复用I/O复用模型是一种能够使用选择、轮询和轮询同时监视多个流中的I/O事件的能力,当空闲时阻止当前线程,当一个或多个流中有I/O事件时阻止

在此,“复用”是指多个网络连接,“复用”是指复用相同的线程。 复用I/O复用技术使单个线程能够高效地处理来自多个客户端的网络I/O连接请求。 可以将网络I/O的时间消耗降到最低

)5) Redis直接自己构建了虚拟机机制,避免了调用系统函数时在移动和请求上浪费时间

三、为什么Redis是单线程的? 这里强调的单线程是指网络请求模块在一个线程上处理。 这意味着一个线程处理所有网络请求,而其他模块仍在使用多个线程。

那么为什么要用单线程呢? 官方的答案是,CPU不是Redis瓶颈,Redis瓶颈最可能是机器内存或网络带宽。 单线程容易实现,而且既然CPU不会成为瓶颈,就理所当然地采用单线程的方案。

但是,虽然使用单线程的方法无法发挥多核CPU的性能,但可以通过单独打开多个Redis实例来解决此问题

四. Redis6.0多线程:1、Redis6.0 之前为什么一直不使用多线程?

Redis使用单线程的可维护性很高。 虽然多线程模型在某些方面很好,但它引入了程序执行顺序的不确定性,同时带来了一系列读写问题,增加了系统的复杂度,同时还可能存在线程切换、解锁、死锁等性能损失

2、Redis6.0 为什么要引入多线程呢?

由于Redis瓶颈不是内存,而是网络I/O模块需要CPU时间,因此Redis6.0多线程处理网络I/O这一部分,充分利用CPU资源,实现网络I/O块

ng>3、Redis6.0 如何开启多线程?

默认情况下Redis是关闭多线程的,可以在conf文件进行配置开启:

io-threads-do-reads yes

io-threads 线程数

## 官方建议的线程数设置:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数,尽量不超过8个。

4、多线程模式下,是否存在线程并发安全问题?

如图,一次redis请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到socket上。

在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。所以,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行,也就不存在并发安全问题。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。