redis6.0之后的多线程版本的问题
一、redis早期版本和新版本的讨论
这个问题其实有些废话,哪个版本肯定都有不同啊。其实这里主要是提到的网上的大家对Redis6.0中的多线程版本的不同即以前宣传的Redis是单线程程版的,之后变成了多线程版本的。网上对这个讨论非常激烈,反正各种说法都有。
其实,结论只有一个,很多讨论的人都是就事论事,没有真正看源码也没有看所谓多线程和单线程应对的场景也就是Redis的正常应用下,它的适应情况。所以,往往大家抓住一个点,开始各种各种表达,然后就没然后了,为了讨论而讨论。
二、redis的单线程和多线程版本
既然是讨论,不妨咱们也多句嘴,百花齐放一下。对Redis来说,其做为一种内存型数据库,其主要目的就是在内存中存储键值对,也就是常说的KV数据。对内存操作来说,速度有多快,开发者们不想都可以知道。假设有一种存储能快到和Cache一样的速度并且容量大,那么多线程意义更不大。前面分析过,所谓各种的处理手段的目的就是为了解决计算机中资源处理速度的不匹配而出来的,多线程也是如此(当然,不能说完全是为了这个)。
那么如果从这种思想出发,可以发现,内存对网络IO的速度那是辗压级别的。好,回头看一下Redis的单线程模型的主要内容:
从上层来看就是一个线程+IO多路复用(epoll或 kevent 或 select)。一个线程对应着这种IO多路复用,恰恰正是优势所在。而前面的网络系列中分析过,无论哪种多路复用,一个前提是,活跃的连接一定不能太多,否则其基本的速度都是差不多的,甚至还不如最简单的select。
如果你要坚持开多个IO多路复用,对Redis这种多点部署的程序来说,不如多部署几个节点。也就是说,需要考虑多点和多线程间的效率、成本和其它条件了。
所以说,所谓单线程指的是这一部分,而不是说整个Redis没有使用多线程,这是第一个要明白的单线程和多线程的区别;其次,单线程在这种环境下,相对多线程至少没有劣势,特别成开发、维护等上反而更有优势。
三、应用场景的分析
在设计和开发一个软件时,最初一定是为了达到自己的某些想法或者说设定目标,如果这种想法和目标不需要某种复杂的技术就可以实现,那么为什么要杀鸡用牛刀呢?换句话说,如果小学的知识可以解决的问题,为什么非要升级到大学知识才去解决呢?但反过来又想,目前小学知识可以解决这个问题,可过了两年发现新的应用场景或者目标如果用到中学的会更好,大学的会更好?做为问题的解决者,你会怎么办?或者可以理解成,可不可以老中青三年一起来解决问题呢?这样想就明白了Redis多线程版本了。推而广之,也就明白了所有的软件迭代升级的特点了。
与时俱进,是每一个人必须掌握的基本思想。
做为内存型的数据库,快是最主要的一种特点。而数据库最典型的特征就是要读写数据到数据库。这二者的目标提出来,可以用后来者的眼光分析一下,多线程在这种场景下是否比单线程更有优势,而且这种优势必须是全面的,成倍以上的。这是什么意思呢。全面,必须要考虑技术的先进性和安全稳定性;也要兼顾容易开发和后期的易维护性,还有其它如成本等等。而不是单纯的考虑一个技术问题。另外,如果使用一项新技术仅仅比旧的技术提高了不多的效率,那么整体的成本仍然是让人无法忍受的。
具体到Redis,其最主要的核心是通过网络接收数据然后通过处理读写内存,这是最基础最核心的需求。前面分析过多路复用,然后再增加一个线程搞一搞读写,既可以快速操作内存,又可以防止出现多线程中的数据一致性和锁,同步等问题。这样一看,单线程没有啥劣势啊,甚至还有优势。然后,再实际测试一下,多线程与单线程在这种情况下,根本没有什么大的优势。而且官方的声明中也提到了:在这种内存IO的数据库中,限制性能的瓶颈不是CPU,而是内存大小和网络IO的处理(注意,这也是后来升到多线程的一个重要原因)。
那么既然不是瓶颈,为什么Redis6要升级多线程呢?
仍然回头看Redis的主流应用线程+IO多路复用。这里有没有可以使用多线程进行优化,从而进一步提高效率的呢?特别是随着Redis的广泛应用,一些复杂的命令和数据结构也被应用上来,协议也在不断的升级和扩充等等。有过网络开发经验的开发者会想到,在网络开发中,高并发是一个重要的特点,虽然不能在同一时间有大量活跃,但可以轮换活跃,保持着一种中等并发的持续性应用。那么此时一个瓶颈出现了,多路复用中,读和写的处理以及监听的处理速度往往不匹配;而且数据读出来的原始解析(解析协议)也很浪费时间,可不可以用一些线程来处理这些功能呢?这些功能如果用多线程处理能提高多少效率呢?会增加多少开发和维护成本呢?而且物理硬件也在不断的推陈出新,多核的CPU已经被广泛在服务器中应用,一些新的技术也涌现出来。这对Redis的开发维护者也提出了更高的要求。
从Redis6.0中提供了这个多线程版本来看,应该是效率明显的,不然不会推出。但仔细看源码,发现整个Redis6.0的核心命令执行仍然是单线程的,这是什么意思?就是最初的设计的意思,简单、安全而又保证效率的情况下,为什么要引入多线程呢?
那么以后会不会继续改进甚至全部改成多线程呢?这个还是得看发展。如果协程被广泛应用后,可以就是协程版了,大家说有没有这种可能?
四、总结
早就跟大家一起分享过,一定要抓住事物本质。针对软件就是找到其应用的目的,其核心思想是什么,而不是简单的说哪种技术好,哪种技术不好。最合适的就最好的,而这个最合适一定是随着应用的发展不断的变化的。孤立的、片面的和僵化的看问题,就很容易陷入到无何止的争论中去。教条主义、本本主义和经验主义,其实大家都犯,但一定要记得打破这层牢笼。否则,就会固步自封,难建寸功。
所以科学和哲学,往往是无法分开的。这也是学习一些思想的目的和原因。
相关文章:
redis6.0之后的多线程版本的问题
一、redis早期版本和新版本的讨论 这个问题其实有些废话,哪个版本肯定都有不同啊。其实这里主要是提到的网上的大家对Redis6.0中的多线程版本的不同即以前宣传的Redis是单线程程版的,之后变成了多线程版本的。网上对这个讨论非常激烈,反正各…...

python的 pandas.Dataframe 和 pandas.Series基础内容
目录 0 有一个比较麻烦琐碎的地方 1 python pandas.Dataframe 2 pd.concat() 可以合并 pd.Dataframe 2.1 pd.concat() 合并规则 3 pd.Dataframe.drop() 删除行列的操作 4 pd.Dataframe 列操作 5 pd.Dataframe 行操作 5.1 sample_dataframe2.head(n2) 取前面的n行&…...

golang学习5
为结构体添加方法 异常处理过程...

【C语言】11月第二次测试 ing
文章目录 1.输入n名同学的成绩和学号,对成绩排序,输出对应学号 要求重复的学号重新输入 计算n名同学的平均值,对小于60分的同学删除分数 大于60分的同学输出:优秀:几人,良好:几人,中…...
行列式的理解与计算:线性代数中的核心概念
开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、ThreeJs、WebGL、Go 经验经验:6 年 前端开发经验,专注于图形渲染和 AI 技术 开源项目:github 简智未来、数字孪生引擎、前端面试题 大家好&a…...
按出生日期排序(结构体专题)
题目描述 送人玫瑰手有余香,小明希望自己能带给他人快乐,于是小明在每个好友生日的时候发去一份生日祝福。小明希望将自己的通讯录按好友的生日排序排序,这样就查看起来方便多了,也避免错过好友的生日。为了小明的美好愿望&#x…...

【C++】拆分详解 - 多态
文章目录 一、概念二、定义和实现1. 多态的构成条件2. 虚函数2.1 虚函数的重写/覆盖2.2 虚函数重写的两个例外 3. override 和 final关键字4. 重载/重写/隐藏的对比5. 例题 三、纯虚函数和抽象类四、多态的原理1. 虚函数表2. 实现原理3. 动态绑定和静态绑定 总结 一、概念 多态…...
Python世界:力扣题解875,珂珂爱吃香蕉,中等
Python世界:力扣题解875,珂珂爱吃香蕉,中等 任务背景思路分析代码实现坑点排查测试套件本文小结 任务背景 问题来自力扣题目875 Koko Eating Bananas,大意如下: Koko loves to eat bananas. There are n piles of bana…...

Java设计模式 —— Java七大设计原则详解
文章目录 前言一、单一职责原则1、概述2、案例演示 二、接口隔离原则1、概述2、案例演示 三、依赖倒转原则1、概述2、案例演示 四、里氏替换原则1、概述2、案例演示 五、开闭原则1、概述2、案例演示 六、迪米特法则1、概述2、案例演示 七、合成/聚合复用原则1、概述2、组合3、聚…...

SpringBoot学习记录(六)配置文件参数化
SpringBoot学习记录(六)配置文件参数化 一、参数提取到配置文件中二、yml配置文件三、ConfigurationProperties注解实现批量属性注入 一、参数提取到配置文件中 定义在代码中的参数的值分散在各个不同的文件中,不便于后期维护管理࿰…...

android 使用MediaPlayer实现音乐播放--获取音乐数据
前面已经添加了权限,有权限后可以去数据库读取音乐文件,一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…...

.net 8使用hangfire实现库存同步任务
C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…...
第 22 章 - Go语言 测试与基准测试
在Go语言中,测试是一个非常重要的部分,它帮助开发者确保代码的正确性、性能以及可维护性。Go语言提供了一套标准的测试工具,这些工具可以帮助开发者编写单元测试、表达式测试(通常也是指单元测试中的断言)、基准测试等…...

VB.Net笔记-更新ing
目录 1.1 设置默认VS的开发环境为VB.NET(2024/11/18) 1.2 新建一个“Hello,world”的窗体(2024/11/18) 1.3 计算圆面积的小程序(2024/11/18) 显示/隐式 声明 (2024/11/18&…...

centos 服务器 docker 使用代理
宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…...
python语言基础
1. 基础语法 Q: Python 中的变量与数据类型有哪些? A: Python 支持多种数据类型,包括数字(整数 int、浮点数 float、复数 complex)、字符串 str、列表 list、元组 tuple、字典 dict 和集合 set。每种数据类型都有其特定的用途和…...
Python中的Apriori库详解
文章目录 Python中的Apriori库详解一、引言二、Apriori算法原理与Python实现1、Apriori算法原理2、Python实现1.1、数据准备1.2、转换数据1.3、计算频繁项集1.4、提取关联规则 三、案例分析1、导入必要的库2、准备数据集3、数据预处理4、应用Apriori算法5、生成关联规则6、打印…...
MongoDB比较查询操作符中英对照表及实例详解
mongodb比较查询操作符中英表格一览表 NameDescription功能$eqMatches values that are equal to a specified value.匹配值等于指定值。$gtMatches values that are greater than a specified value.匹配值大于指定值。$gteMatches values that are greater than or equal to…...

掌上单片机实验室 – RT-Thread + ROS2 初探(25)
在初步尝试RT-Thread之后,一直在琢磨如何进一步感受它的优点,因为前面只是用了它的内核,感觉和FreeRTOS、uCOS等RTOS差别不大,至于它们性能、可靠性上的差异,在这种学习性的程序中,很难有所察觉。 RT-Threa…...
Kotlin中的?.和!!主要区别
目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。 ?.(安全调用操作符):当变量可能为null时,使用?.可以安全地调用其方法或属性…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...