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的核心命令执行仍然是单线程的,这是什么意思?就是最初的设计的意思,简单、安全而又保证效率的情况下,为什么要引入多线程呢?
那么以后会不会继续改进甚至全部改成多线程呢?这个还是得看发展。如果协程被广泛应用后,可以就是协程版了,大家说有没有这种可能?

四、总结

早就跟大家一起分享过,一定要抓住事物本质。针对软件就是找到其应用的目的,其核心思想是什么,而不是简单的说哪种技术好,哪种技术不好。最合适的就最好的,而这个最合适一定是随着应用的发展不断的变化的。孤立的、片面的和僵化的看问题,就很容易陷入到无何止的争论中去。教条主义、本本主义和经验主义,其实大家都犯,但一定要记得打破这层牢笼。否则,就会固步自封,难建寸功。
所以科学和哲学,往往是无法分开的。这也是学习一些思想的目的和原因。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年人工智能技术赋能网络安全应用测试:广东盈世在钓鱼邮件识别场景荣获第三名!

近期,2024年国家网络安全宣传周“网络安全技术高峰论坛主论坛暨粤港澳大湾区网络安全大会”在广州成功举办。会上,国家计算机网络应急技术处理协调中心公布了“2024年人工智能技术赋能网络安全应用测试结果”。结果显示,广东盈世计算机科技有…

spring @Async

讨论一下 spring boot 下 使用 spring 异步执行的注解 先看下这个类: 这个类是 spring boot auto configure 下完成 TaskExecutor的自动配置。 1. 需要在类路径存在 ThreadPoolTaskExecutor,这个类是 是spring context模块下的类,也就是 需…

搜维尔科技:多画面显示3D系统解决方案,数据孪生可视化大屏3D展示技术

集成多画面系统 集成多画面系统解决方案 1.适合多个用户的紧凑型入门级解决方案 2.会议室功能、审批功能、3D模型讨论等多种使用可能性 3.配有组合设备,方便整合 CAVE 多画面显示系统 1.专业的大屏幕多画面解决方案 2.墙壁、天花板和地板三面CAVE 3.专为沉浸…

linux从0到1——shell编程7

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言,一个记录对应的指标值的绝对值,肯定落在所有指标值的绝对值的最小值和最大值构成的区间内,根据一定的算法&#x…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…

使用 前端技术 创建 QR 码生成器 API1

前言 QR码(Quick Response Code)是一种二维码,于1994年开发。它能快速存储和识别数据,包含黑白方块图案,常用于扫描获取信息。QR码具有高容错性和快速读取的优点,广泛应用于广告、支付、物流等领域。通过扫…

Hash table类算法【leetcode】

哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n),但如果使用哈希…

UI自动化测试中公认最佳的设计模式-POM

一、概念 什么是POM? POM是PageObjectModule(页面对象模式)的缩写,其目的是为了Web UI测试创建对象库。在这种模式下,应用涉及的每一个页面应该定义为一个单独的类。类中应该包含此页面上的页面元素对象和处理这些元…

Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?

大家好,我是锋哥。今天分享关于【Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的?】面试题。希望对大家有帮助; Elasticsearch客户端在和集群连接时,如何选择特定的节点执行请求的? 100…

Python数据结构day2

一、链表 1.1目的 解决顺序表存储数据有上限,并且插入和删除操作效率低的问题 1.2概念 链表:链式存储的线性表,使用随机物理内存存储逻辑上连续的数据 链表的组成:由一个个结点组成 结点:由数据域和链接域组成&a…

【经纬度转地址实现方案】根据给定的经纬度,查询对应城市,通过建立经纬度geohash-行政区映射表,实现快速查询

文章目录 背景目标方案设计:表结构设计:方案实现1.高德API获取行政区边界点2.外包矩形中心作为中心点3.坐标点经纬度转换为geohash 测试建表语句测试造数测试用例测试结果 总结总结 背景 最近遇到一个需求,需要查询给定的经纬度坐标点&#…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代,大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力,为AI算法提供了丰富的原材料,助力其挖掘出有价值的洞见,推动明智决策的制…

LINUX系统编程之——环境变量

目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1)不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…

QT:QListView实现table自定义代理

介绍 QListVIew有两种切换形式,QListView::IconMode和QListView::ListMode,通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构,也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理&…

IDEA2023 创建SpringBoot项目(一)

一、Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 二、快速开发 1.打开IDEA选择 File->New->Project 2、…

初级数据结构——树

目录 前言一、树的基本概念二、二叉树三、树的表示方法四、树的遍历树的代码模版五、经典例题[2236. 判断根结点是否等于子结点之和](https://leetcode.cn/problems/root-equals-sum-of-children/description/)代码题解 六、总结结语 前言 从这一期开始数据结构开始有那么一点…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台,执行 Addressable Build 运行,加载 bundle 内的预制体 显示正常 2.Unit…

视频去重工具

视频去重工具 工具截图 下载 回复:“0028”,即可自动获取

javascrip页面交互

元素的三大系列 offset系列 offset初相识 offset系列属性 作用 element.offsetParent 返回作为该元素带有定位的父级元素,如果父级没有定位,则返回body element.offsetTop 返回元素相对于有定位父元素上方的偏移量 element.offsetLeft 返回元素…