Redis - Redis 6.0 新特性之多线程模型

news2024/12/26 15:15:01

1. Redis6.0之前的版本真的是单线程么?

否!Redis 在处理客户端的请求时,包括获取 (socket 读)、解析、执⾏、内容返回 (socket 写) 等都由⼀个顺序串⾏的主线程处理,这就是所谓的「单线程」。

在执行命令阶段:Redis是单线程来执行命令的,每一条到达读服务端的命令并不会立即执行,所有的命令都会进入一个 socket 任务队列中,当 socket 可读则交给单线程事件分发器逐个被执行,即一个线程处理所有网络请求。如下图所示:

在这里插入图片描述

从Redis 4.0 以后并不是严格意义上的单线程,除了主线程外,Redis 也有后台线程或子进程处理一些其他较为缓慢的操作(例如:无用连接的释放、慢IO访问和一些其他类似操作 - 清理脏数据、生成快照、AOF重写等)。

2. Redis 6.0之前为什么一直不使用多线程?

Redis官方是这样回答的:

使用 Redis 时,几乎不存在 CPU 成为瓶颈的情况,Redis 主要受限于内存和网络。例如:在一个普通的 Linux 系统上,Redis 通过使用 pipelining 每秒可以处理 100W 个请求,如果应该程序主要使用 O(N) 或 O(log(N)) 的命令,它几乎不会占用太多的CPU。

如果要用到多核CPU,可以搭建多个 Redis 实例来解决。

多线程模型,系统复杂,性能损耗高

多线程模型带来了并发读写的问题,增加了系统的复杂度;同时也可能存在上下文切换与竞争,多线程切换,甚至是加解锁导致死锁而造成的性能损耗。

Redis 通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。

单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的惰性 Rehash、Lpush 等等 “线程不安全” 的命令都可以无锁进行。

为什么说Redis的瓶颈不在CPU?

Redis 绝大部分操作是基于内存的,而且是存KV(key-value)操作,命令执行的速度非常快。

我们可以这么理解:Redis 的数据存储在一个大的 HashMap 中,而 HashMap 的优势就是查找和写入的时间复杂度都是O(1),Redis 内部采用这种结构存储数据,就奠定了Redis高性能的基础。

3. Redis 6.0 为什么引入多线程?

Redis 基于内存操作,内存的响应时长大约为100纳秒,单线程的 Redis 处理数据的极限是 80,000 到 100,000 QPS,对于80%的公司来说,单线程的Redis已经足够使用了。

但随着硬件性能提升,Redis 的性能瓶颈可能出现⽹络 IO 的读写,也就是:单个线程处理⽹络读写的速度跟不上底层⽹络硬件的速度;越来越复杂的业务场景,也需要更大的QPS。

从 Redis 自身角度来说,因为读写网络的 read/write 系统调用占用了 Redis 执行期间大部分 CPU 时间,瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:

  • 提⾼⽹络 IO 性能,典型的实现⽐如使⽤ DPDK 来替代内核⽹络栈的⽅式。
  • 使⽤多线程充分利⽤多核,提⾼⽹络请求读写的并⾏度,典型的实现⽐如 Memcached

协议栈优化的这种方式跟 Redis 关系不大,支持多线程是一种最有效最便捷的操作方式。所以总结起来,redis支持多线程主要就是两个原因:

  • 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核。
  • 多线程任务可以分摊 Redis 同步 IO 读写负荷。

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

4. Redis 6.0 的多线程模型

4.1 Redis 6.0 是否默认开启了多线程模型

否!Redis 6.0 的多线程是禁用的,默认使用是主线程。官方建议:只在机器至少有4个内核时才启用多线程模型,且至少留下一个备用内核。如果需要开启多线程需修改 redis.conf 配置文件:

# io-threads-do-reads no
# 改为
io-threads-do-reads yes

4.2 Redis 6.0 开启多线程后,如何设置线程数

开启多线程后,还需要设置线程数,否则是不生效的。同样修改redis.conf配置文件:

# io-threads 4
# 改为
io-threads 3

Redis 官方建议:只在机器至少有4个内核时才启用多线程模型,且至少留下一个备用内核。4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。

5. Redis多线程的实现机制

5.1 Redis 的多线程

Redis 采⽤多个 IO 线程来处理⽹络请求,提⾼⽹络请求处理的并⾏度。Redis 多 IO 线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。这是因为:

  • ⽹络处理经常是瓶颈,通过多线程并⾏处理可提⾼性能。
  • 继续使⽤单线程执⾏读写命令,不需要为了保证 Lua 脚本、事务、等开发多线程安全机制,实现更简单。

架构图如下:
在这里插入图片描述

5.2 主线程与 IO 多线程是如何实现协作

Redis 6.0 多线程是把主线程处理网络IO和协议解析这两件事给了一组独立的线程处理,使得多个 socket 读写可以并⾏化,但 Redis 命令还是主线程串⾏执⾏。

主要流程如下:

  1. 主线程负责接收并建立(多个)连接请求,获取 socket 后放入全局等待处理队列;
  2. 主线程处理完这些事件之后,通过RR(Round Robin 轮询)将可读 socket 分配给这些 IO 线程;
  3. 主线程阻塞,等待 IO 线程完成命令的读取、解析;
  4. 主线程执⾏ IO 线程读取和解析出来的 Redis 请求命令,并将结果写到输出缓冲区;
  5. 主线程阻塞,等待 IO 线程将命令执⾏结果写回 socket(客户端);
  6. 主线程执行所有命令并清空整个等待队列,等待客户端后续的请求队列。

在这里插入图片描述

6. Redis 6.0与老版性能对比评测

正式支持多线程!Redis 6.0与老版性能对比评测

7. 多线程模型的缺陷

Redis 的多线程⽹络模型实际上并不是⼀个标准的 Multi-Reactors/Master-Workers 模型,Redis 的多线程⽅案中,I/O 线程任务仅仅是通过 socket 读取客户端请求命令并解析,却没有真正去执⾏命令。

所有客户端命令最后还需要回到主线程去执⾏,因此对多核的利⽤率并不算⾼,⽽且每次主线程都必须在分配完任务之后忙轮询等待所有 I/O 线程完成任务之后才能继续执⾏其他逻辑。

Redis ⽬前的多线程⽅案更像是⼀个折中的选择:既保持了原系统的兼容性,⼜能利⽤多核提升 I/O 性能。

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

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

相关文章

【jQuery超快速入门教程】上篇

🍀作者主页:在下周周ovo🍀系列专栏:从零开始百天学习前端基础🍀其他平台:博客园1️⃣前言:jQuery必备网站jQuery下载地址jQuery中文文档jQuery插件库1️⃣一、为什么要学习jQuery?jQ…

蓝库云|2023年企业4个数字化转型关键,成功之路近在咫尺

数字化转型:由上而下的过程 企业数字化转型最主要的原因在于企业管理者的决定。数字化转型是由「上」而「下」的过程,如果管理层没有转型的确切目标与规划,与竞争者相比之下,经营模式将会原地踏步、无法超越。蓝库云根据最新客户…

C++:C++全局变量:看完还不懂全局变量来捶我

我们知道,全局变量时C语言语法和语义中一个很重要的知识点,首先它的存在意义需要从三个不同角度去理解。 对于程序员来说,它是一个记录内容的变量(variable)对于编译/链接器来说,它是一个需要解析的符号 &a…

java使用JSch连接服务器实现命令交互

java使用JSch连接服务器实现命令交互1、通过maven引入jsch2、代码编写&#xff08;1&#xff09;创建MyUserInfo&#xff08;2&#xff09;创建Shell类连接服务器&#xff08;3&#xff09;启动3、测试结果JSch官网 1、通过maven引入jsch <dependency><groupId>co…

万字长文--详解Git(快速入门)

Git基础与扩展Git1、Git概念1.1 关于版本控制1.2 Git基础概念2、Git基础操作2.1 安装并配置Git2.2 Git的基本操作3、Github操作3.1 关于开源3.2 注册账号3.3 远程仓库的使用4、Git分支操作4.1 本地分支操作4.2 远程分支操作Git 1、Git概念 1.1 关于版本控制 文件的版本管理的…

7 种常用的数据挖掘技术分享

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 摘要: 随着信息领域的进步…

详解DFS(深度优先搜索)算法+模板+指数+排列+组合型枚举+带分数四道例题

目录 前言&#xff1a; 1.背景 2.图解分析 3.算法思想 4.dfs四大例题 4.1.递归实现指数型枚举 题解&#xff1a; 4.2.递归实现排列型枚举 题解&#xff1a; 字典序: 4.3.递归实现组合型枚举 题解: 4.4.带分数 题解&#xff1a; 5.最后&#xff1a; 前言&#xff1a;…

来了解一下ASN.1?

想要了解证书&#xff0c;必须先了解ASN.1和编码规则。这篇文章简单介绍ASN.1&#xff0c;不过分探讨细节&#xff0c;大家如果有兴趣可以继续深入研究。 一、ASN.1 ASN.1是Abstract Syntax Notation One&#xff08;抽象文法描述语言&#xff09;的缩写。计算机系统之间交换…

Android Studio 阅读 frameworks/base 下的代码

从网上搜的方案都是生成 android.ipr&#xff0c;但是这个需要整编&#xff0c;整编一次比较费时费劲&#xff0c;所以想了个巧招 首先用 Android Studio 打开 frameworks/base&#xff0c;其文件夹目录大概形如下&#xff1a; ├── Android.bp├── Android.mk├── api …

入门深度学习——基础知识总结(python代码实现)

入门深度学习——基础知识总结&#xff08;python代码实现&#xff09; 目前&#xff0c;AI基本上可以说是烂大街了。几乎什么都可以说使用了AI技术&#xff0c;听起来很拉风&#xff0c;很nb的样子。而其中目前最为火热的非深度学习&#xff08;Deep Learning&#xff09;莫属…

VisionPro (R) QuickBuild 工具使用问题解决 自用

右击我的电脑选择属性。搜索“安全中心” 点击病毒和威胁保护 在病毒和威胁保护中选择威胁信息&#xff08;当前威胁-保护历史记录&#xff09; 受影响的项目 file: C:\WINDOWS\sysWOW64\cognex.dll 相机和光源不能同时触发&#xff0c;光源要先于相机触发并且持续相机采集…

leetCode周赛-328

相关题解题目一&#xff1a;6291. 数组元素和与数字和的绝对差题目二&#xff1a;6292. 子矩阵元素加 1题目三&#xff1a;6293. 统计好子数组的数目题目四&#xff1a;2538. 最大价值和与最小价值和的差值题目一&#xff1a;6291. 数组元素和与数字和的绝对差 题目链接&#…

Web Security 之 Insecure deserialization

Insecure deserialization 在本节中&#xff0c;我们将介绍什么是不安全的反序列化&#xff0c;并描述它是如何使网站遭受高危害性攻击的。我们将重点介绍典型的场景&#xff0c;并演示一些 PHP、Ruby 和 Java 反序列化的具体示例。最后也会介绍一些避免不安全的反序列化漏洞的…

14正交向量与子空间

正交向量与子空间 本章研究的重点还是之前提到过的子空间&#xff0c;但是本章我们主要从正交的角度来探讨这些子空间具有的性质&#xff0c;主要内容见下图。 注意&#xff0c;上图指出了我们之前没有关注到的子空间的一些性质&#xff1a;对于一个矩阵&#xff0c;其零空间…

微信推送消息给女友提醒每天天气情况,本文讲解流程,附带代码,可快速上手。

实现的效果图 此模板为自己添加的&#xff0c;各位看客可以自行添加&#xff0c;如何添加接着往下看。备注在数据库自定义设置。如果你非专业人士&#xff0c;可以联系作者给你专属设置。如果需要代为设置跳转到文章结束位置。 完整的代码 代码下载地址 微信公众号设置 申…

《Linux Shell脚本攻略》学习笔记-第八章

8.1 简介 TCP/IP网络的运作过程就是在节点之间传递分组。每一个分组中都包含了目标的IP地址以及处理分组中数据的应用程序端口号。 当节点接收到分组时&#xff0c;它会查看自己是否就是改分组的目的地。如果是&#xff0c;节点会再检查端口号并调用相应的应用程序来处理分组数…

Cookie 会话身份验证是如何工作的?

在 Web 应用程序中&#xff0c;Cookie-Session 是一种标准的身份验证方法。饼干&#xff0c;也被称为“sweet cookies”。类型为“小文本文件”&#xff0c;是指一些网站为了识别用户身份而存储在客户端的数据。Session的主要功能是通过服务器记录用户的状态。 在典型的在线购物…

类与类之间关系的表示方式

1.关联关系 关联关系是对象之间的一种引用关系&#xff0c;用于表示一类对象与另一类对象之间的联系&#xff0c;如老师和学生&#xff0c;师傅和徒弟&#xff0c;丈夫和妻子等。关联关系是类与类之间最常用的一种关系&#xff0c;分为一般关联关系&#xff0c;聚合关系和组合…

郭天祥十天入门单片机学习笔记

电子元件 排阻 有两种&#xff1a; nn1 二极管 几个概念 限流电阻&#xff1a;与二极管串联&#xff0c;防止电流过大烧毁二极管导通压降&#xff1a;二极管亮起的最小电压 贴片式绿色为阴极&#xff0c;插入式短脚为阴极 数码管 共阴极&#xff1a;对应段选信号置1亮…

测试开发 | 这些常用测试平台,你们公司在用的是哪些呢?

测试管理平台是贯穿测试整个生命周期的工具集合&#xff0c;它主要解决的是测试过程中团队协作的问题。在整个测试过程中&#xff0c;需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。 图片108091 50.2 KB 测试用例管理平台…