Redis 线程模式

Redis 是单线程吗?

Redis 单线程指的是 [接收客户端请求 -> 解析请求 -> 进行数据读写操作 -> 发送数据给客户端] 这个过程是由一个线程 (主线程) 来完成的,这也是常说的 Redis 是单线程的原因。

但是 ,Redis 程序不是单线程的,Redis 在启动的时候,是会 启动后台线程 的:

  • Redis 在 2.6 版本,会启动 2 个后台线程,分别处理关闭文件、AOF刷盘这两个任务;
  • Redis 在 4.0 版本后,新增了一个新的后台线程,用来异步释放 Redis 内存,也就是 lazyfree 线程。例如执行 unlink key / flushdb async / flushall async 等命令,会把这些删除操作交给后台线程来执行,好处就是不会导致 Redis 主线程卡顿。因此,当我们要删除一个大 key 的时候,不要使用 del 命令删除,因为 del 是在主线程处理的,这样会导致 Redis 主线程卡顿,因此我们应该使用 unlink 命令来异步删除大 key。

之所以 Redis 为 [关闭文件、AOF 刷盘、释放内存] 这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。

后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。

关闭文件、AOF刷盘、释放内存这三个任务都有各自的任务队列:

  • BIO_CLOSE_FILE,关闭文件任务队列:当队列有任务后,后台线程会调用 close(fd),将文件关闭;
  • BIO_AOF_FSYNC,AOF刷盘任务队列:当 AOF日志配置成 everysec 选项后,主线程会把 AOF写日志操作封装成一个任务,也放到队列中。当发现队列有任务后,后台线程会调用 fsync(fd) ,将 AOF 文件刷盘;
  • BIO_LAZY_FREE,lazy free 任务队列:当队列有任务后,后台线程会 free(obj)释放对象 / free(dict) 删除数据库所有对象 / free(skiplist) 释放跳表对象;

Redis 单线程模式是怎样的?

Redis 6.0 版本之前的单线程模式如下图:

图中的蓝色部分是一个事件循环,是由主线程负责的,可以看到网络 I/O 和命令处理都是单线程。Redis 初始化的时候,会做下面几件事情:

  • 首先,调用epoll_create() 创建一个 epoll 对象和调用 socket() 创建一个服务端 socket
  • 然后,调用 bind() 绑定端口和调用 listen() 监听该socket
  • 然后,将调用epoll_ctl()将 listen socket 加入到 epoll ,同时注册 [连接事件] 处理函数。

初始化完成后,主线程就进入到一个事件循环函数,主要会做以下事情:

  • 首先,先调用 处理发送队列函数,看发送队列里是否有任务,如果有发送任务,则通过 write 函数将客户端发送缓存区里的数据发送出去,如果这一轮数据没有发送完,就会注册写事件处理函数,等待 epoll_wait 发现可写后再处理
  • 接着,调用 epoll_wait 函数等待事件的到来:
    • 如果是连接事件到来,则会调用 连接事件处理函数,该函数会做这些事情:调用 accept 获取已连接的 socket -> 调用 epoll_ctl 将已连接的 socket 加入到 epoll -> 注册 [读事件] 处理函数;
    • 如果是读事件到来,则会调用 读事件处理函数,该函数会做这些事情:调用 read 获取客户端发送的数据 -> 解析命令 -> 处理命令 -> 将客户端对象添加到发送队列 -> 将执行结果写到发送缓冲区等待发送;
    • 如果是写事件到来,则会调用 写事件处理函数,该函数会做这些事情:通过 write 函数将客户端发送缓冲区里的数据发送出去,如果这一轮数据没有发送完,就会继续注册写事件处理函数,等待 epoll_wait 发现可写后再处理。

Redis 采用单线程为什么还这么快?

主要有以下几个原因:

  • Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此 Redis 瓶颈可能是机器的内存或者网络带宽,而并非 CPU ,既然 CPU不是瓶颈,那么自然就采用单线程的解决方案了。
  • Redis 采用但线程模型可以避免多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且页不会导致死锁的问题
  • Redis 采用了 I / O 多路复用机制 处理大量的客户端Socket 请求,IO多路复用机制是指一个线程处理多个 IO 流。就是我们经常听到的 select/epoll 机制。简单来首,在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听 Socket 和已连接 Socket 。内核会一直监听这些 Socket 上的连接请求或数据请求。一旦有请求到达,就会交付给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO流的效果。

为什么 6.0 之前使用的是单线程?

核心意思是:CPU并不是制约 Redis 性能表现的瓶颈所在,更多情况下是收到内存大小和网络I/O的限制,所以 Redis 核心网络模型使用单线程并没有什么问题,如果想要使用服务的多核CPU ,可以在一台服务器上启动多个节点或者采用分片式集群的方式。

除此之外:

使用单线程后,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗


Redis 6.0 后为什么引入了多线程?

这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络的 I / O 的处理上

所以为了提高网络 I/O 的并行度,Redis 6.0 对于网络 I/O 采用多线程来处理。但是对于命令的执行,Redis 仍然使用单线程来处理,所以不要误解 Redis 有多线程同时执行命令。

Redis官方表示Redis 6.0 版本引入的多线程 I/O 特性对性能提升至少是一倍以上。

Redis 6.0 版本支持的 I/O 多线程特性,默认情况下 I/O 多线程只针对发送响应数据,并不会以多线程的方式处理读请求。要想开启多线程处理客户端读请求,就需要把 redis.conf 配置文件中的 io-threads-do-reads 配置项设为 yes。

//读请求也使用io多线程
io-threads-do-reads yes 

同时 Redis.conf 配置文件中提供了 IO 多线程个数的配置项。

// io-threads N,表示启用 N-1 个 I/O 多线程(主线程也算一个 I/O 线程)
io-threads 4 

关于线程数的设置,官方的建议是如果为 4 核的 CPU ,建议线程数设置为 2 或 3,如果为 8 核 CPU 建议将线程数设置为 6,线程数一定要小于机器核数,线程数并不是越大越好。

因此 ,Redis 6.0 版本后,Redis 在启动的时候,默认情况下会额外创建 6 个线程(这里的线程数不包括主线程):

  • Redis-server :Redis 的主线程,主要负责执行命令
  • bio_close_file、bio_aof_fsync、bio_lazy_free:三个后台线程,分别异步处理 关闭文件任务、AOF刷盘任务、释放内存任务;
  • io_thd_1、io_thd_2、io_thd_3:三个 I/O 线程,io-threads 默认是 4 ,所以会启动 3 (4-1)个 I/O多线程,用来分担 Redis 网络 I/O的压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 实现 SIFT→SURF 算法关键点检测实现

目录 1,SIFT算法原理 1.1,基本流程 1.1.1 尺度空间极值检测 1.1.2 关键点定位 1.1.3 关键点方向确定 1.1.4 关键点描述 1.1.5 总结 1.2 SURF原理 2 代码实现 3 结果展示 4,你肯定会遇到报错 cv2.error: OpenCV(3.4.8) C…

Spring面试题8:面试官:说一说Spring的BeanFactory

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory Spring的BeanFactory是Spring框架的核心容器,负责管理和创建Bean对象。它是一个工厂类,用于实例化、配置和管理Bean的…

nodejs+vue 医院病历管理系统

系统使用权限分别包括管理员、病人和医生,其中管理员拥有着最大的权限,同时管理员的功能模块也是最多的,管理员可以对系统上所有信息进行管理。用户可以修改个人信息,对医院病历信息进行查询,对住院信息进行添加、修改…

权威认可!安全狗获CNVD“漏洞信息报送贡献单位”殊荣

9月24日,国家信息安全漏洞共享平台公布了2022年度CNVD支撑单位年度工作情况及优秀单位个人表彰名单。 作为国内云原生安全领导厂商,安全狗入选漏洞信息报送贡献单位。 厦门服云信息科技有限公司(品牌名:安全狗)成立于…

tp5连接多个数据库

一、如果你的主数据库配置文件都在config.php里 直接在config.php中中定义db2&#xff1a; 控制器中打印一下&#xff1a; <?php namespace app\index\controller; use think\Controller; use think\Db; use think\Request; class Index extends Controller {public fun…

win10,WSL的Ubuntu配python3.7手记

1.装linux 先在windows上安装WSL版本的Ubuntu Windows10系统安装Ubuntu子系统_哔哩哔哩_bilibili &#xff08;WSL2什么的一直没搞清楚&#xff09; 图形界面会出一些问题&#xff0c;注意勾选ccsm出的界面设置 win10安装Ubuntu16.04子系统&#xff0c;并开启桌面环境_win…

记录下电脑windows安装Tina的过程

下面图片记录windows下安装电路仿真软件Tina的整个过程。 首先肯定下载安装包 然后就一直点下一步下一步 这里随便填一下用户名和公司名称 默认安装位置是C盘&#xff0c;如果C盘空间不够&#xff0c;可以修改安装位置 然后继续下一步下一步 这里不知道什么意思&#xff…

【红日靶场】vulnstack1-完整渗透过程

目录 下载地址红日靶场基本环境配置攻击思维导图网络结构 系统环境配置外网打点对phpmyadmin渗透对zzcms的渗透&#xff1a;getshell失败案例getshell成功案例模版制作&#xff1a;应用导入上传&#xff1a;其他方式&#xff1a; 内网渗透信息收集msf上线&#xff1a;搭建隧道内…

LeetCode刷题

一 螺旋矩阵 题目链接&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a;…

算法基础之归并排序

一、归并排序的形象理解 原题链接 示例代码 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;merge_sort(q, l, mid), merge_sort(q, mid 1, r);int k 0, i l, j mid 1;while (i < mid && j < r) //第一处if (q[i]…

计算机类软件方向适合参加的比赛

前言 博主是一名计算机专业的大三学生&#xff0c;在校时候参加了很多比赛和训练营&#xff0c;现在给大家博主参加过的几个的比赛&#xff0c;希望能给大一大二的学生提供一点建议。 正文 最近也有比赛的&#xff0c;我会从时间线上来给大家推荐一些比赛&#xff0c;并且给…

C/C++程序,从命令行传入参数

C/C中如何让程序接受并处理命令行参数_c 命令行接收--version_饼干叔叔海洋的博客-CSDN博客 #include <stdio.h> #include <stdlib.h>//argc&#xff1a;argument count //argv: arguments vector,参数向量。 //33 777 103 int main(int argc, char **argv){ //…

工地临时用电之智慧用电:全方位保障用电安全

随着科技进步和智能化的发展&#xff0c;工地用电管理也迎来了智慧化的革新。智慧用电&#xff0c;作为智慧工地的重要组成部分&#xff0c;通过集中式管理和创新的技术手段&#xff0c;为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构&#xff0c;力安科…

Docker 部署前端项目(非自动化)

部署前端项目 1. nginx配置文件1.1 nginxConf 2. 创建容器2.1 添加项目2.2 下载项目依赖2.3 打包前端项目2.4 创建容器2.5 查看容器 3. 视频演示4. 注意 1. nginx配置文件 1.1 nginxConf 首先你需要有nginx配置文件&#xff0c;你可以执行以下命令获取配置文件 # 安装镜像-生成…

babel的配置执行顺序

babel配置文件&#xff1a; //.babelrc {"presets": ["babel/preset-env","babel/preset-react"],"plugins": ["babel/plugin-proposal-class-properties",["babel/plugin-transform-runtime",{"corejs&quo…

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)

个人医疗系统&#xff08;SpringJsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…

智慧公厕自动化保洁系统,让公共厕所实现7*24 持续整洁

随着科技的不断进步&#xff0c;越来越多的创新方案应用于各个领域&#xff0c;公共厕所的智慧化也不例外。本文重点介绍智慧公厕源头厂家广州中期科技有限公司&#xff0c;大量案例项目中所使用的智慧公厕自动化保洁系统&#xff0c;能有效地节省人力&#xff0c;并保持公共厕…

网络安全,weblogic漏洞复现

WebLogic是美国Oracle公司出品的一个Java应用服务器&#xff0c;是一个基于JAVAEE架构的中间件&#xff0c;用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。 2|0弱口令登陆部署shell文件 App Weblogic Path weblogic/weak_password 2|1介绍 用户管理…

广东电信和中兴开通首个50G PON万兆入企啦!

最近广东电信和中兴在深圳市南山科技园成功开通了首个50G PON万兆入企应用&#xff0c;双方将携手打造50G PON万兆入企的示范应用样板工程和产业园区&#xff0c;看来“万兆入企&#xff0c;助力深圳打造全球数字先锋城市”的目标是指日可待了。 深圳在2022年发布了《深圳市推进…

数据库管理工具DBeaverUltimate mac中文高级功能

DBeaver Ultimate mac是一款数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、Oracle、PostgreSQL、SQLite、Microsoft SQL Server等。它提供了一个直观的用户界面&#xff0c;使用户可以轻松地管理和查询数据库&#xff0c;包括创建和修改表、执行SQL查询、导…