Redis的单线程与多线程

news2024/11/24 11:01:19

Redis的核心处理逻辑一直都是单线程 有一些分支模块是多线程(某些异步流程从4.0开始用的多线程,例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的删除操作。网络I/O解包从6.0开始用的是多线程;)

为什么是单线程

多线程多好啊可以利用多核优势

官方给的解释

意思就是Redis的定位,是内存k-v存储, 是做短平快的热点数据处理,一般来说执行会很快,执行本身不是瓶颈,而瓶颈通常在网络I/O,处理逻辑多线程并不会有太大收益。
同时,Redis本身 秉持简洁高效的理念,代码的简单性、可维护性 是Redis以来一直以来的追求,引入多线程带来的复杂性远比想象的要大,而且多线程本身也会引入额外成本,细说

1.多线程的引入的复杂度很大


1.首先,多线程引入之后,Redis原来的顺序执行特性就不复存在,为了支持事务的原子性、隔离性,Redis就不得不引入一些很复杂的实现; .
2.Redis的数据结构极其高效,在单线程模式下做了很多特性的优化,如果引入多线程,那么所有
底层数据结构都要改造为线程安全,这会是极其复杂的工作;
3.而且,多线程模式也使得程序调试更加复杂和麻烦,会带来额外的开发成本及运营成本,也更容易犯错(回想一下MYSQL并发....)

2.多线程带来额外的成本

1.上下文切换成本,多线程调度需要切换线程上下文,这个操作先存储当前线程的本地数据、程序指针等,然后载入另一个线程数据,这种内核操作的成本不可忽视。
2.同步机制的开销,-些公共资源,在单线程模式下直接访问就行了,多线程需要通过加锁等方式去进行同步,这也是不可忽视的CPU开销;
3.一个线程本身也占据内存大小,对Redis这种内存数据库而言,内存非常珍贵,多线程本身带来的内存使用的成本也需要谨慎决策。
 

单线程为什么这么快

第一,Redis的大部分操作在内存上完成,内存操作本身就特别快;
第二,Redis追求极致,选择了很多高效的数据结构,并做了非常多的优化,比如ziplist, hash,跳表,有时候一种对象底层有几种实现以应对不同场景。
第三,Redis 采用了多路复用机制,使其在网络I0操作中能并发处理大量的客户端请求,实现高吞吐量。
第一第二点挺好理解的 第三点怎么说

什么叫I/0多路复用,简单理解来说,就是有I/0操作触发的时候,就会产生通知,收到通知,再去处理通知对应的事件,针对I/0多路复用,Redis做了一层包装,叫Reactor模型。
本质就是监听各种事件,当事件发生时,将事件分发给不同的处理器。

这样就不会阻塞在某一个操作上,充分发挥性能,可以说I/O多路复用让Redis单线程也有了较大的并发度,注意这里是并发,而不是并行,在这种模式下,Redis单 核的性能可以说是被充分的利用了。
 

但是呢

现在业务量实在是太大了

前面也有说过,Redis选择 单线程的核心原因是Redis是都是内存操作,CPU处理都非常快,瓶颈更容易出现在I/O而不是CPU,所以选择了单线程模型。

随着时代的发展,很多业务的请求量都达到了一个曾经难以想象的高度,I/O操作确实成为了瓶颈,而之前Redis处理流程中读取请求、发送回包都属于I/O操作,所以Redis引入了多线程,这里的多线程也不是说将整个处理逻辑都多线程化,如果这么做,需要对所有数据结构进行线程安全重构,这是巨大的成本,并且,也不见得能有多大提升,甚至可能因为损耗而降低,毕竟瓶颈大多时候都不在处理,瓶颈实际一般都在 于网络I/O。
因为上述情况,Redis选择了引入多线程来处理网络I/O,仍然使用单线程框架来执行Redis命令,这样既保持了Redis核心的单线程处理架构,完全兼容以前的实现,又引入了多线程解决提升网络I/O的性能。
 

关于多线程不需要了解太多

首先 多线程是6.0之后引入的 为了解决日益变多的数据量 默认是关闭了 可以在.conf里面修改 多线程负责的是处理网络I/O 具体来说

读取并解析指令以及回包。

单线程模式下是一个线程完成读取、解析、执行、将回包放入客户端缓冲区;
但在多线程模式下,会将不同的client放 入clients_ pending_ read任务队列中, 后续会通Round-Robin轮询负载均衡策略把这些client分给其他IO线程和主线程进行读取和解析;在回包的时候,也是利用Round-Robin轮询负 载均衡策略把等待回包队列中的任务连续均匀地分配给IO线程各自的
本地FIFO任务队列和主线程自己,主线程轮询等待所有IO线程完成回包任务

 

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

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

相关文章

二、编写第一个 Spring MVC 程序

文章目录 一、编写第一个 Spring MVC 程序 一、编写第一个 Spring MVC 程序 代码示例 创建 maven 项目&#xff0c;以此项目为父项目&#xff0c;在父项目的 pom.xml 中导入相关依赖 <dependencies><dependency><groupId>junit</groupId><artifactI…

阿里云ACP知识点

前言&#xff1a;记录ACP错题 1、在创建阿里云ECS时&#xff0c;每台服务器必须要包含_______用来存储操作系统和核心配置。 系统盘&#xff08;不是实例&#xff0c;实例是一个虚拟的计算环境&#xff0c;由CPU、内存、系统盘和运行的操作系统组成&#xff1b;ESC实例作为云…

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…

81. 搜索旋转排序数组 II

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a; 解法一&#xff1a;直接从前往后搜索&#xff0c;时间复杂度O(n) AC代码&#xff1a; class Solution {public boolean search(int[] nums, int target)…

在收藏夹里“积灰”的好东西——“收藏从未停止,行动从未开始”

方向一&#xff1a;分享一道你收藏的好题 小雅兰刚学数据结构与算法的时候&#xff0c;学的真的是很吃力&#xff0c;感觉链表真的特别的难&#xff0c;在学习了后面的知识之后&#xff0c;发现链表慢慢变得简单了&#xff0c;若是放在现在&#xff0c;小雅兰仍然觉得链表的知…

JProfiler —CPU评测

当JProfiler测量方法调用的执行时间及其调用堆栈时&#xff0c;我们称之为“CPU评测”。这些数据以多种方式呈现。根据你试图解决的问题&#xff0c;其中一个或另一个演示将是最有帮助的。默认情况下不会记录CPU数据&#xff0c;您必须打开CPU记录才能捕获有趣的用例。 一、调…

密码破解!字典攻击(C/C++代码实现)

字典攻击是一种通过系统地将字典中的每个单词作为密码输入&#xff0c;从而侵入受密码保护的计算机、网络或其他IT资源的方法。字典攻击也可以用于查找解密加密消息或文档所需的密钥。 字典攻击之所以有效&#xff0c;是因为许多计算机用户和企业坚持使用普通单词作为密码。这…

苏纷享首届生态人脉会成功举办,纷享销客助力伙伴共同发展

近日&#xff0c;纷享销客&苏纷享成功举办了首届生态人脉会&#xff0c;该活动于8月3日下午在苏州东方之门举行。本次会议汇聚了来自近20家企业的销售精英&#xff0c;包括金蝶、泛微、夏谷、蚂蚁分工、创享、黑湖智造等众多知名企业。会议秉持着“建立生态、共同发展、深耕…

软工导论知识框架(九)软件项目管理

通过计划、组织、控制一系列活动&#xff0c;合理配置使用资源&#xff0c;达到既定目标的活动。项目管理优先于任何技术之前&#xff0c;并且贯穿于整个软件生命周期全过程。 一.软件规模度量 1.代码行技术 估计每个功能需要源代码&#xff08;参考类似项目的历史数据&#…

论文详解 ——《SNR-Aware Low-light Image Enhancement》

文章目录 Abstract1.Introduction2. Related Work3. Our Method3.1 Long- and Short-range Branches3.2 SNR-based Spatially-varying Feature Fusion3.3 SNR-guided Attention in Transformer3.4 Loss Function 4. Experiments4.1. Datasets and Implementation Details4.2 Co…

实验二十七、电压传输特性的测量

一、题目 利用 Multisim 测试图1 所示各电路的电压传输特性。 图 1 电压比较器 图1\,\,电压比较器 图1电压比较器 二、仿真注意事项 &#xff08;1&#xff09;仿真电路所有的 A \textrm A A 均采用虚拟电压比较器。合理选择稳压管的限流电阻&#xff0c;使其既稳压又不至于…

armbian使用1panel快速部署部署springBoot项目后端

文章目录 前言环境准备实现步骤第一步&#xff1a;Armbian安装1panel第二步&#xff1a;安装数据库第三步&#xff1a;查看数据库容器重要信息【重要】查看容器所在的网络查看容器连接地址 第四步&#xff1a;项目配置和打包第五步:构建项目镜像 前言 这里只是简单记录部署spr…

开源,微信小程序 美食便签地图(FoodNoteMap)的设计与开发

目录 0 前言 1 美食便签地图简介 2 美食便签地图小程序端开发 2.1技术选型 2.2前端UI设计 2.3主页界面 2.4个人信息界面 2.5 添加美食界面 2.6美食便签界面 2.8 美食好友界面 2.9 美食圈子界面 2.10 子页面-店铺详情界面 2.11 后台数据缓存 2.12 订阅消息通知 2.1…

FastApi-1-结合sql 增/查demo

目录 FastAPI学习记录项目结构部分接口/代码展示感受全部代码 FastAPI学习记录 fastapi已经学习有一段时间&#xff0c;今天抽时间简单整理下。 官网介绍&#xff1a; FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Py…

配置容器以使其自动启动

配置容器以使其自动启动 配置容器 利用注册表服务器上的 rsyslog-custom-cert 镜像&#xff0c;创建一个名为 logserver 的容器。 将其配置为以 systemd 服务的形式运行&#xff0c;且仅面向现有用户 william 。 该服务应命名为 container-logserver , 并应在系统重新引…

每日一题——二叉树中和为某一值的路径

题目 给定一个二叉树root和一个值 sum &#xff0c;判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。 该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点叶子节点是指没有子节点的节点路径只能从父节点到子节点&#xff0c;不能从子节点到父节点总节点…

Coreutils工具包,Windows下使用Linux命令

之前总结过两篇有关【如何在Windows系统下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推荐一个类似的工具包Coreutils 一、简介 GNU core utilities是GNU操作系统基本…

HCIP——堆叠技术

堆叠 一、简介二、堆叠的优势1、提高可靠性2、简化组网3、简化管理4、强大的网络拓展能力 三、堆叠的方式1、堆叠卡堆叠2、业务口堆叠 四、堆叠的原理1、角色2、单机堆叠3、堆叠ID4、堆叠的优先级5、堆叠的建立过程 五、堆叠的配置 一、简介 堆叠技术 — 可以将多台真是得物理…

Android之版本号、版本别名、API等级对应关系(全)(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…