Redis6 多线程模型
优质博文:IT-BLOG-CN
一、单线程的优缺点
对于一个请求操作Redis
主要做3
件事情:从客户端读取数据/解析、执行Redis
命令、回写数据给客户端。所以主线程其实就是把所有操作的这3
件事情串行一起执行,因为是基于内存,所以执行速度非常快。
优点&缺点:
【1】优点:不存在锁的竞争问题和避免线程间CPU
的切换。
【2】缺点:单线程无法利用多CPU
和串行操作,某个操作“出问题”会“阻塞”后续操作。
Redis6.0
之前为什么一直不使用多线程?
使用Redis
时,几乎不存在CPU
成为瓶颈的情况,Redis
主要受限于内存和网络。例如:在一个普通的Linux
系统上,Redis
通过使用pipelining
每秒可以处理100W
个请求,如果应该程序主要使用O(N)
或O(log(N))
的命令,它几乎不会占用太多的CPU
。如果要用到多核CPU
,可以搭建多个Redis
实例来解决。
为什么说Redis
的瓶颈不在CPU
?
Redis
绝大部分操作是基于内存的,而且是存KV(key-value)
操作,命令执行的速度非常快。我们可以这么理解:Redis
的数据存储在一个大的HashMap
中,而HashMap
的优势就是查找和写入的时间复杂度都是O(1)
,Redis
内部采用这种结构存储数据,就奠定了Redis
高性能的基础。
二、Redis 的多线程
Redis
基于内存操作,内存的响应时长大约为100
纳秒,单线程的Redis
处理数据的极限是80,000
到100,000 QPS
,对于80%
的公司来说,单线程的Redis
已经足够使用了。
因为网络I/O
在Redis
执行期间占用了大部分CPU
时间,所以把网络I/O
部分单独抽离出来,做成多线程的方式。这里所说的多线程,其实就是将Redis
单线程中做的这两件事情“从客户端读取数据、回写数据给客户端”(也可以称为网络I/O
),处理成多线程的方式,但是“执行Redis
命令”还是在主线程中串行执行,这个逻辑保持不变。
主线程和多个I/O
线程,都同时处理图中的“队列”,是不是会存在锁竞争的关系尼?这里有个巧妙的设计,就是当epoll
获取socket
链接时,会将该事件先全部扔进队列中,比如扔了N
个事件,这时主线程就会处于忙碌状态。然后多个I/O
线程开始去并行进行网络I/O
,并对数据进行协议解析,当队列全部处理完毕后,主线程会对队列中请求串行“执行Redis
命令”,然后清空该队列。所以整个执行流程总结下来:主线程执行请求入队列 -> I/O
线程并行进行网络读 -> 主线程串行执行Redis
命令 -> I/O
线程并行进行网络写 ->主线程清空队列,并接收下一批请求。
Redis 6.0
的多线程是禁用的,默认使用是主线程。官方建议:只在机器至少有4
个内核时才启用多线程模型,且至少留下一个备用内核。如果需要开启多线程需修改redis.conf
配置文件:
io-threads-do-reads yes
开启多线程后,还需要设置线程数,否则是不生效的。同样修改redis.conf
配置文件:
io-threads 3
Redis
官方建议:只在机器至少有4个内核时才启用多线程模型,且至少留下一个备用内核。4
核的机器建议设置为2
或3
个线程,8
核的建议设置为6
个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8
个基本就没什么意义了。
三、Redis6 多线程原理解析
近年来底层网络硬件性能越来越好,Redis
的性能瓶颈逐渐体现在网络I/O
的读写上,单个线程处理网络I/O
读写的速度跟不上底层网络硬件执行的速度。
Redis6.0
多线程是把主线程处理网络IO
和协议解析这两件事给了一组独立的线程处理,使得多个socket
读写可以并⾏化,但Redis
命令还是主线程串⾏执⾏。
主要流程如下:
【1】主线程负责接收并建立(多个)连接请求,获取socket
后放入全局等待处理队列;
【2】主线程处理完这些事件之后,通过RR
(Round Robin
轮询)将可读socket
分配给这些IO
线程;
【3】主线程阻塞,等待IO
线程完成命令的读取、解析;
继续使⽤单线程执⾏读写命令,不需要为了保证
Lua
脚本、事务、等开发多线程安全机制,实现更简单。
【4】主线程执⾏IO
线程读取和解析出来的Redis
请求命令,并将结果写到输出缓冲区;
【5】主线程阻塞,等待IO
线程将命令执⾏结果写回socket
(客户端);
【6】主线程执行所有命令并清空整个等待队列,等待客户端后续的请求队列;
三、性能对比
压测配置:
Redis Server
: 阿里云Ubuntu 18.04,8 CPU 2.5 GHZ
, 8G
内存,主机型号ecs.ic5.2xlarge
Redis Benchmark Client
: 阿里云Ubuntu 18.04,8 2.5 GHZ CPU
, 8G
内存,主机型号ecs.ic5.2xlarge
压测命令: redis-benchmark -h 192.168.0.49 -a foobared -t set,get -n 1000000 -r 100000000 --threads 4 -d ${datasize} -c 256
从上面可以看到GET/SET
命令在4
线程IO
时性能相比单线程是几乎是翻倍了。另外,这些数据只是为了简单验证多线程IO
是否真正带来性能优化,并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标,且只是目前的unstble
分支的性能,不排除后续发布的正式版本的性能会更好。
相关文章:
Redis6 多线程模型
优质博文:IT-BLOG-CN 一、单线程的优缺点 对于一个请求操作Redis主要做3件事情:从客户端读取数据/解析、执行Redis命令、回写数据给客户端。所以主线程其实就是把所有操作的这3件事情串行一起执行,因为是基于内存,所以执行速度非…...
Python的异步编程
什么是协程? 协程不是计算机系统提供,程序员人为创造。 协程也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法: greenlet&…...
初识Linux · 进程等待
目录 前言: 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言: 通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念ÿ…...
面向对象建模
UML 关系 UML 关系主要有:依赖、关联、聚合、组合、实现、继承。 类图 #mermaid-svg-jcAjcVcPmgmWDpcI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jcAjcVcPmgmWDpcI .error-icon{fill:#552222;}#m…...
MetaJUI v0.4 遇到的一些问题及解决办法记录
1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载,https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压,用Unity3d 打开项目,会出现如下问题,按照图中提示操作即可。 4、打开工程后会出现…...
从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程
上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT,现在来说一下如何新建一个自己的OMNeT的工程。 在 Omnet安装完成后,samples/tictoc 中有该例子的完整文件,你可以立刻运行该文件看他是怎么工作的,不过更推荐按接下来的步骤一步…...
【Android】布局优化—include,merge,ViewStub的使用方法
引言 1.重要性 在Android应用开发中,布局是用户界面的基础。一个高效的布局不仅能提升用户体验,还能显著改善应用的性能。随着应用功能的复杂性增加,布局的优化变得尤为重要。优化布局能够减少渲染时间,提高响应速度,…...
传奇外网架设教程带图文解说—Gee引擎
架设前准备工作: ①通过百度网盘下载版本、补丁、客户端和DBC2000。版本解压到D盘,客户端解压到D盘或是E盘,补丁先不解压 ②安装和配置DBC2000,有些版本不一定用的是DBC2000数据库,看引擎默认的数据库是哪个 DBC数据…...
MySQL | excel数据输出insert语句
需求 在日常生产运维过程中,有很多需要进行人工梳理的excel数据,到了研发这一侧需要转为sql语句进行数据修正,如何输出insert插入语句? 方案 在空白列插入,选择需要的列 "INSERT INTO tab_name1 (name, desc) …...
足球青训俱乐部管理:Spring Boot技术驱动
摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…...
一次实践:给自己的手机摄像头进行相机标定
文章目录 1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄 3. 基本原理3.1 成像原理3.2 畸变校正 4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位 4.3 解算结果 5. 问题补充 1. 问题引入 不得不说,现在的计算机视觉技术已经发展到足够成熟的阶段…...
【docker学习】Linux系统离线方式安装docker环境方法
centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是:docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上,用ftp工具上传即可 解压…...
vscode开发uniapp安装插件指南
安装vuets的相关插件 首先是vue的相关插件,目前2024年9月应该是vue-offical 安装uniapp开发插件 uni-create-view :快速创建 uni-app 页面 安装uni-create-view之后修改插件拓展设置 勾选第一个选择创建视图时创建同名文件夹 选择第二个创建文件夹中生…...
Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用
一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群,使用了3台服务器作为节点,但在搭建的过程中发现每台服务器的elasticsearch服务都正常,但是不能相互发现,期间进行了一些配置的修改偶尔出现了…...
蓝牙Mesh介绍
蓝牙Mesh(Bluetooth Mesh)是一种基于蓝牙技术的无线通信网络拓扑,用于在设备之间创建大规模的多点到多点网络。蓝牙Mesh网络可以让多个蓝牙设备相互通信和协作,适合需要高覆盖范围和高可靠性的场景,例如智能家居、工业…...
Qt 窗口中鼠标点击事件的坐标探讨
// 鼠标点击事件 void Widget::mousePressEvent(QMouseEvent *event) {/*event->pos()、event->windowPos()和event->localPos()都表示鼠标点击位置在窗口中的位置,它们的值都是一样的,区别在于event->pos()是QPoint类型,event-&…...
服务器虚拟化的全面指南
1. 引言 在数字化转型的浪潮中,服务器虚拟化成为现代IT基础设施的核心组成部分。它通过将物理服务器资源分割成多个虚拟资源,极大地提高了资源利用率和灵活性。本篇文章将深入探讨服务器虚拟化的概念、优势、挑战、技术工具、最佳实践及未来发展趋势。 …...
Linux启动mysql报错
甲方公司意外停电,所有服务器重启后,发现部署在Linux上的mysql数据库启动失败.再加上老员工离职,新接手项目,对Linux系统了解不多,解决起来用时较多,特此记录。 1.启动及报错 1.1 启动语句1 启动语句1&a…...
基于大数据的二手房价数据可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
C++模拟实现vector容器【万字模拟✨】
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯ÿ…...
论文笔记:LAFF 文本到视频检索的新基准
整理了ECCV2022 Lightweight Attentional Feature Fusion: A New Baseline for Text-to-Video Retrieval 论文的阅读笔记 背景模型问题定义LAFF(Lightweight Attention Feature Fusion)LAFF Block 实验消融实验可视化对比试验 这篇文章提出了一种新颖灵活的特征融合方式&#x…...
iSTFT 完美重构的条件详解
目录 引言1. 短时傅里叶变换(STFT)与逆变换(iSTFT)概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域,短时傅里叶变换(Short-Time Fourier Transform,简…...
SSH(安全外壳协议)可以基于多种加密算法
SSH(安全外壳协议)可以基于多种加密算法,确保数据的机密性和完整性。以下是 SSH 中常见的加密类型: 1. 对称加密 对称加密算法用于加密会话中的数据,常见的算法包括: AES(高级加密标准&#…...
Navicat 工具 下载安装
准备工作 下载 下载链接:https://www.123865.com/ps/EF7OTd-kdAnH 演示环境 操作系统:windows10 产品:Navicat 版本: 15.0.25 注意:如果需要其他版本可以自行下载。 安装步骤 1、解压(如果解压中出现提示…...
家用高清投影仪怎么选?目前口碑最好的投影仪推荐
双十一马上要到了,而且今年还有投影仪的家电国补,所以大家入手投影仪的需求也越来越多,但是家用高清投影仪怎么选?什么投影仪最适合家用?家庭投影仪哪个牌子质量最好?今天就给大家做一个2024性价比高的家用…...
阿里云盾同步漏洞之限制请求数
阿里云sdk不支持一次性请求太多,所以我们需要限制每次请求最大1000条,此代码无任何参考意义。仅做记录 func VulList(hole_type string) ([]*sas20181203.DescribeVulListResponseBodyVulRecords, error) {pageSize : 20allItems : make([]*sas20181203…...
docker安装kafka-manager
kafkamanager docker安装_mob64ca12d80f3a的技术博客_51CTO博客 # 1、拉取镜像及创建容器 docker pull hlebalbau/kafka-manager docker run -d --name kafka-manager -p 9000:9000 --networkhost hlebalbau/kafka-manager# 2、增设端口 腾讯云# 3、修改防火墙 sudo firewall-…...
Android Studio 新版本 Logcat 的使用详解
点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志,会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具,它可以更快的帮助开发者调试应用程序。 步入正题,看图说话。 点…...
基于php摄影门户网站
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
uniapp中uni.request的统一封装 (ts版)
文章目录 前言一、我们为什么要去封装?二、具体实现1.创建一个请求封装文件:2.封装 uni.request:3.如何去使用? 总结 前言 在uniapp中如何去更简洁高效的发送我们的请求,下面就介绍了uni.request()二次封装。 一、我们…...
广西高端网站建设/怎么做网站推广多少钱
myeclipse 遇到的一些问题及解决方案参考文章: (1)myeclipse 遇到的一些问题及解决方案 (2)https://www.cnblogs.com/losesea/p/3417291.html (3)https://www.javazxz.com/thread-4655-1-1.h…...
工地用木模板尺寸/seo科技网
说明: 本文的作者Eric Raymond是Open Source Software领域的领袖,这方面许多 新的思想正是从他那儿产生的,同时他也是UNIX上最流行的Email软件Fetchmail 的作者。 下面这篇文章有点儿长,然而它是值得你去耐心把它读完的。文章以Fe…...
枣庄市网站建设/艺考培训
2009他来了。2008的任务基本完成,2009还有很快多事要做。...
做酒水网站有哪些/长沙网络推广营销
「 周四见 」公开课分享时间:2019年1月3日20:30本周四见不见不散~周四见|知数堂公开课系列之《变化多端的SQL写法及性能》分享方式 线上直播,不限地域,火星也行1腾讯课堂直播不想下载客户端,想点开就能听课,没问题…...
现在在市场上做网站怎么样/百度关键词挖掘查排名工具
CSS美化INPUT placeholder效果。CSS代码美化文本框里的placeholder文字。 ::selection伪元素 简而言之:单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素。 伪元素由双冒号和伪元素名称组成。双冒号是在当前规范中引入的,用于区分伪类和伪元素…...
手游网站建设的宗旨/网站维护需要多长时间
2020年对华为来说,无疑是十分艰难的一年,通信设备与消费电子两大业务都受到了不小的冲击,令人担忧。但是,华为不仅挺过了2020年,还取得了一系列优异成绩,一次次证明着自己的实力。日前,华为又有…...