首页 > 数据库 >2023-05-30:Redis6.0为什么要引入多线程呢?

2023-05-30:Redis6.0为什么要引入多线程呢?

时间:2023-05-30 21:22:38浏览次数:69  
标签:Redis6.0 05 单线程 性能 Redis 内存 多线程 CPU

2023-05-30:Redis6.0为什么要引入多线程呢?

答案2023-05-30:

Redis多线程比单线程性能提升一倍:

Redis 6.0 引入多线程 IO 特性对性能提升至少是一倍以上。据 Redis 作者 antirez 在 RedisConf 2019 分享中介绍,多线程 IO 特性可以显著提高 Redis 的性能和吞吐量,实测 GET/SET 命令在 4 线程 IO 下的性能相比单线程几乎翻倍。国内也有一些大牛在阿里云 ESC 上测试了 unstable 版本的 Redis,结果也证实了多线程比单线程性能提升一倍左右的结论。

巨头公司的需求

Redis 将所有数据放在内存中,因此具有非常快的响应速度,大约只需要 100 纳秒左右。对于小数据包,Redis 服务器可以处理 80,000 到 100,000 QPS 左右,这已经是 Redis 处理极限了。虽然对于 80% 的公司来说,单线程的 Redis 已经足够使用,但一些高并发和复杂的业务场景需要更大的 QPS。

随着业务的不断发展,越来越多的公司面临着上亿的交易量,需要更高的性能和吞吐量。为了应对这些挑战,Redis 引入了多线程 IO 特性,在多核 CPU 和高并发情况下充分利用现代硬件资源,从而提高 Redis 的性能和吞吐量,满足更复杂和高并发的业务需求。

集群方案的问题

常见的解决方案是在分布式架构中对数据进行分区,并采用多个 Redis 服务器来存储数据。然而,这种方案也存在着一些问题。例如,需要管理的 Redis 服务器数量太多,维护代价很大;同时,数据分区也可能不够灵活,无法满足一些特定业务场景下的需求。

在采用数据分区的 Redis 集群中,某些适用于单个 Redis 服务器的命令可能不再适用。例如,一些针对特定键值对的命令如果跨越多个节点,就会出现互相干扰和不一致的情况。

尽管 Redis 的数据分区方案可以提高性能和扩展性,但也存在一些问题。例如,数据分区无法解决热点读/写问题,这可能会导致某些节点的负载过高,而其他节点则处于闲置状态。此外,数据分区可能会导致数据偏斜和重新分配变得更加复杂,特别是在进行节点的放大/缩小时。

1.纯内存KV操作

Redis 是一款基于内存的数据存储系统,因此其操作都非常快速。相比于 CPU,Redis 的性能瓶颈更多来自于两个方面:机器内存和网络带宽。

在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常迅速。

在计算机的世界中,CPU 的速度是远大于内存和硬盘的速度的。然而,由于内存的速度比硬盘快得多,因此 Redis 将其所有数据存储在内存中,以获得更高的读写性能。

Redis 的操作都是基于内存的,因此绝大部分请求都是纯粹的内存操作,非常迅速。Redis 集群可以支持每秒数百万次的读取和写入操作,响应时间通常在微秒或毫秒级别。这种高速读写操作对于处理高并发、实时数据的场景非常有用。

2.单线程操作

使用单线程可以省去多线程时CPU上下文会切换的时间,也不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。对于内存系统来说,多次读写都是在一个CPU上,没有上下文切换效率就是最高的!既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章的采用单线程的方案了。

Redis 的单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求。而对于其他模块,Redis 仍然可以使用多线程来提高性能。

具体来说,在 Redis 中,网络请求模块和数据存储模块是两个独立的模块。网络请求模块负责接收和处理客户端请求,而数据存储模块则负责读取和写入数据。在 Redis 的单线程模型中,网络请求模块使用一个线程处理所有客户端请求,而数据存储模块仍然可以使用多线程来提高性能。

例如,在 Redis 中,主从复制和持久化等操作都会使用多线程来加速处理。此外,Redis 还引入了多线程 IO 特性,以充分利用现代硬件资源提高性能和吞吐量。

总之,Redis 的单线程模型指的是网络请求模块只使用一个线程处理所有客户端请求,这种模型可以最大化 Redis 的效率和简化代码实现。但是,其他模块仍然可以使用多线程来提高性能和并发处理能力。同时,Redis 的多线程 IO 特性也可以增强数据库的性能和扩展性。

3.I/O 多路复用

为什么 Redis 中要使用 I/O 多路复用这种技术呢?

Redis 是一款跑在单线程中的高性能 NoSQL 数据库,所有的操作都是按照顺序线性执行的。由于 Redis 的读写操作等待用户输入或输出都是阻塞的,因此 I/O 操作如果不能直接返回,会导致某一文件的 I/O 阻塞,从而整个进程无法对其他客户提供服务。

为了解决这个问题,出现了 I/O 多路复用技术。I/O 多路复用技术可以同时监视多个文件描述符,当某个文件描述符就绪时,通知程序进行相应的 I/O 操作,从而避免了阻塞等待带来的性能瓶颈。

4.Reactor 设计模式

Redis 基于 Reactor 模式开发了自己的网络事件处理器,称之为文件事件处理器(File Event Handler)。

文件事件处理器是 Redis 中网络事件的核心实现。它通过 select、poll 或 epoll 等系统级别的多路复用机制,对多个文件描述符进行轮询,当某个文件描述符就绪时,Redis 可以立即对其进行读取或写入操作,从而实现高效的异步非阻塞 I/O 操作。

标签:Redis6.0,05,单线程,性能,Redis,内存,多线程,CPU
From: https://www.cnblogs.com/moonfdd/p/17444500.html

相关文章

  • 欧奈儿行业 RPS 排名,一图览全貌 2023-05-29
    自动复盘2023-05-30k线图是最好的老师,点击详情图可以看到行业20日RPS的排名,最底下子图是行业rps走势线据我观察,成交额超过100亿,成功几率比较高,一般有买点标注的,走势还可以公众hao:醉卧梦星河欧奈尔行业RPS排名天天更新追踪主力行业趋......
  • 转:多线程详解
    转自:https://juejin.cn/post/71230166680951849331.什么是多线程1.1进程当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。1.2线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈......
  • 继续学习英语20230530
    Simplyput简单来说 isolated 英[ˈaɪsəleɪtɪd]美[ˈaɪsəleɪtɪd]adj.偏远的;孤零零的;孤独的;孤立的;单独的;只出现一次的;v.(使)隔离,孤立,脱离;将…剔出(以便看清和单独处理);使(某物质、细胞等)分离;使离析; leverages英[ˈliːvərɪdʒɪz]......
  • 2023-05-30 taro如何切换到其他已发布的小程序
    taro可以把一套小程序代码发布成多个小程序,那么要如何维护这些小程序呢,咱也不懂,咱也是刚开始学习怎么操作。开始前先感谢chatGpt这个工具,它真的很棒,几乎没有什么是它不会的,我的很多一些问题都是问chatGpt,就比如这篇文章都是chatGpt给我的。要将Taro项目切换到已经发布的小程序,需......
  • 使用powercli 批量多线程 克隆vsphere虚拟机
    $VMS=import-csv-Path'vm001.csv'$Job=$VMS|ForEach-Object-Parallel{#忽略位$Skip=$($_.skip)if($Skip-eq"yes"){continue}#虚拟机名字$VMname=$($_.name)#资源池名字$Resource_Pool=$($_.res_po......
  • 2023-05-30 前端通过node获取七牛云的token(token最好还是在后端返回,前端获取token会暴
    constfs=require('fs');constqiniu=require('qiniu');varaccessKey='你的accessKey';varsecretKey='你的secretKey';varmac=newqiniu.auth.digest.Mac(accessKey,secretKey);//获取七牛tokenvaroptions={......
  • Vue05-Vuex
    01.什么是状态管理在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在我们应用程序的某一个位置,对于这些数据的管理我们就称之为状态管理。在Vue开发中,我们使用组件化的开发方式:在组件中我们定义data或者在setup中返回使用的数据,这些数据我们称之为state(状......
  • 2023-05-30 浅试nodejs实现登录接口业务(未完,待测试)
    constexpress=require('express');constbodyParser=require('body-parser');constmysql=require('mysql');//创建MySQL连接池constpool=mysql.createPool({host:'localhost',user:'root',password......
  • gdb调试c++多线程死锁问题初步
    https://blog.csdn.net/zsiming/article/details/126695393 总结:psaux|grepfilename //找出进程IDtop-HpPID //列出进程号为PID下的所有线程gdbatattchPID //用gdb调试正在运行的进程(进程号为PID)(需要sudo权限)threadapplyallbt //这里涉及2个命令:thr......
  • C/C++学生成绩管理系统[2023-05-30]
    C/C++学生成绩管理系统[2023-05-30]学生成绩管理系统设计----高级语言课程设计题目问题描述:设学生信息包括:学号、姓名、期末成绩、平时成绩,对学生的学习成绩信息进行管理。设计要求:实现学生信息的录入、修改、插入、删除、查询、计算总评成绩、根据总评成绩排序和划分等级、......