Redis:单线程模型效率为什么这么高,6.0为啥开始引入多线程

目录

Redis6.0之前是单线程模型

文件事件处理器

文件事件

文件事件处理器

客户端与 Redis 的一次通信过程:

为啥 Redis 单线程模型也能效率这么高?

Rlinux必学的60个命令edis单线程问题

Redis 6.0 开始引入多线程

开启IO多线程

数据处理

Redis6.0之前是单线程模型

首先我们要明确一个共nosql数据库分类识,我们通常所说的Redis单线程是指获取 (socket 读)、解析、数据处理技术执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这个主线程就是我们平时说的"单线程c语言修仙",而其他的清理脏数据、无用连接的释放、LRU淘汰策略等等也是有其他线程在处理的nosql数据库分类,因此其实在Redis6之前的linux操作系统基础知识Redis本质上c语言基础知识入门也是多线程的。

为什么这些操作要redis放在同一个主线程中,官方给出的解释:传送门

  • 通常瓶颈不在 CPU,而是在内存和网络IO;
  • 多线程会带来线程不安全的情况;linux重启命令
  • 多线程可能存在线程切换、甚至加锁数据处理包括数据的解锁、死锁造成的性能损耗;c语言入门自学
  • 单线程降低了Redis内部实现复杂度;
  • hash的惰性rehash,lpush等线程不安全的命令可以无锁执行;

文件事件处理器

Redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler。

Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单c语言必背代码线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来数据处理选择对应的事件处理器进行处理。

如果被监听的socket准备好执行accept、read、write、close等操作的时候,跟操作对应的文数据处理包括数据的收集使用加工件事件就会产生,这个时候文件事件处理器就会调用之前关联好的事件处理器来处理这个事件。

文件事件处理器是单线程模式运行的,但是通过IO多路复用机制监听多个socket,可以实现高性能的网络通信模型,又可以跟内nosql数据库分类部其他单线程的模块进行对接,保证了redis内部的线程模型的简单性。

文件事件处理器的结构包含 4 个部分:

  • 多个 socket
  • IO 多路复用程序
  • redist件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理redis分布式锁器)

多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类数据处理包括数据的收集型交给对应的事件处理器进行处数据处理方法有哪些理。

文件事件

当socket变得可读时(比如客户端对redis执行write操作,或者close操作),或者有新的可以应答的sccket出现时(客户端对redis执行connect操作)redis集群,socket就会产生一个AE_RrediscoverEADAnosql数据库的四大类型BLc语言E事件。

当socket变得可写的时候(客户端对redis执行rnosql三大基石ead操作),socket会产生一个AE_WRIredisTABLE事件。

Inosql是什么意思O多路复用程序可以同时监听AE_REABLE和AE_WRITABLE两种事件,要是一个socket同时产生了AE_READABLE和AE_WRITABLE两种事件,那么文件事件分派数据处理包括数据的收集使用加工器优先处理AE_REABLE事件,然后才是AE_WRITABLE事件。

文件rediscover事件处理器

如果是客户端要连接rnosql技术edis,那么会为socket关联连接应答处理器

如果是客户端要linux操作系统基础知识数据redis分布式锁redis,那么会为soc语言入门自学cket关联命令请求处理器

如果是客户端要从NOSQLredis读数据,那么会为socket关联命令回复处理器

客户端与 Redis 的一次通信过程:

Redis:单线程模型效率为什么这么高,6.0为啥开始引入多线程

客户端与 Rc语言程序设计edis 的一次通信过程Redis:单线程模型效率为什么这么高,6.0为啥开始引入多线程

要明白,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。

首先,Redis 服务端进程初始化的时候,会将 server socket 的 AE_READABLE 事件与连接应答处理器关联。

客户端 socket01 向 Redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server sockenosql数据库分类t 产生的事件后,将该c语言基础知识 socket 压入队列中。文件linux操作系统基础知识事件分派器从队列中获取 socket,数据处理的最小单位是交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 AE_READABLEc语言基础知识入门件与命令请求处理器关联。

假设此时客户端发送了一个 set key value 请求,此时nosql三大基石 Redis 中的 socket01 会产redis数据结构AE_READABLE 事件,IO 多路复用程序将 socket01 压入队列,此时事件分派器从队列中获取到 socket01 产生的 AE_READABLE 事件,由于前面 socket01 的 AE_READABLE 事件已经与命数据处理包括数据的收集令请求处理器关联,因此事件分派器将事件交给命nosql数据库的特点令请求处理器来处理。c语言命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置。操作完成后,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。c语言程序设计

如果此时客户端准备好接收返回结果了,那么 Redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,C语言事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok ,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

这样便完成了一次通信。

为啥 Redis 单线程模型也能效率这么高?

Redis 抽象了一套 AE 事件模型,将 IO 事件和时间事件融入一起,redist同时借助多路复用机制(linux上用epoll) 的回调特性,使得 IO 读nosql与mysql的区别写都是非阻塞的,实现高性c语言编译器能的网络处理能力。加上 Redis 基于内存的数据处redis分布式锁理,这就是 “单线程,但却高性能” 的核心原因。

  1. 纯内存操作。
  2. 核心是基于非阻塞的 IO 多路复用机制。
  3. C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。
  4. 单线程反而避免了多线程的频繁上下文切换问c语言题,预防了多线程可能产生的竞争问题。

Redis单线程问题

IO 数据的读写依然是阻塞的,这也是 Redis 目前的主要性能瓶颈之一,特别是在数据吞吐量特别大的时候,

  1. 单线程无法利用多CPU
  2. 串行操作,C语言某个操作“出问题”会“阻塞”后续操作

Redis 6.0 开始引入多线程

注意! Rnosql三大基石edis 6.0 之后的版本抛弃nosql是什么意思了单线程模型这一设计,原本使用单线程运行的 Redis 也开始选择性地使用多线程模型

前面还在强调 Redis 单线程模型的高效性,现在为什么又要引入多线程?这其实说明 Redis 在有些方面,单线程已经不具有优势了。因为读redis的五种数据类型写网络的 Read/Write 系统c语言基础知识入门调用在 Redis 执行期间占用了大部分 CPU 时linux间,如果把网络redis读写做成多线程的方式对性能会有很大提升。

Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。 之所以这么设计是不想 Redis 因为多线程而变得复杂,需要去控制 key、lua、事务、LPU数据处理包括哪些内容SH/LPOP 等等的并发问题。

开启IO多线程redis

默认情况下,Redis多线程是禁用的,我们可以数据处理包括哪些内容redis.conf配置文件选择开启:

#开启IO多线程
io-threads-do-reads yes
#配置线程数量,如果设为1就是主线程模式。
io-threads 4

Redis:单线程模型效率为什么这么高,6.0为啥开始引入多线程

官方建议:至少4核的机器才开启IOnosql怎么读多线程,并且除非真的遇到了性能瓶颈,否则不建议开启此配置 ,且配置的线程数数据处理工程师少于机器总线程数,如果有4核建议开启2,3个线程,如果有8核建议开6线程。线程并不是越多越c语言入门自学好,多于8个线程意数据处理包括哪些内容义不redis的五种数据类型大。

总结

Redis 选择使用单线程模型处理客户端的请数据处理求主数据处理包括数据的收集存储加工和输出要还是因为 CPU 不是 Redis 服务器的瓶颈,所以使用多线程模型带来的性能提升并不能抵消它带来的开发成本和维护成本,系统的性能瓶颈也主要在网络 I/O 操作上;而 Redis 引入多线程操作也是出于性能上的考虑linux命令,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,c语言入门自学提高执行的效率。

  1. Redis的多路复用技术,支持epoll、kqueue、sellinux是什么操作系统ector
  2. 5.0版本及以前,处理客户端请求的线程只有一个,串行处理
  3. 6.0版本引入了wolinux是什么操作系统rker Threlinux必学的60个命令adredis持久化,只处理网络IO读取和写入,核心redis持久化IO负责串行处理客户端指linux操作系统基础知识

参考链接:

advanceredis集群d-java/redlinuxis-single-thread-model.md at mairedis分布式锁n doocs/advanced-java GitHub

Redis系列(十六)、Redis6新特性之IO多线程_王义凯 的博客-CSDN博客