2023-05-30:Redis6.0为什么要引入多线程呢?
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 操作。
2023-05-30:Redis6.0为什么要引入多线程呢?的更多相关文章
- 支持多线程的Redis6.0来了
支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...
- 实战派 | Java项目中玩转Redis6.0客户端缓存!
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...
- 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理
05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...
- 追求性能极致:Redis6.0的多线程模型
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么
Android7.0 PopupWindow的兼容问题 Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...
- 正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"
#!/usr/bin/env python import re def f1(arg): return 1 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / ...
- linux安装redis-6.0.1单机和集群
redis作为一个直接操作内存的key-value存储系统,也是一个支持数据持久化的Nosql数据库,具有非常快速的读写速度,可用于数据缓存.消息队列等. 一.单机版安装 1.下载redis 进入re ...
- centos7 编译安装 redis-6.0.5
安装redis sudo yum install redis centos自带的redis才3.2 太旧了所以使用源码编译 需要先安装gcc新版才能编译 centos7 默认的 gcc 版本为:4.8 ...
- Redis6.0.6集群服务搭建
实现目标 一台主机上搭建3主3从高可用redis集群 环境 Linux :CentOS7 Redis : 6.0.6 准备工作 1.查看是否有安装wget命令,如果没有安装使用yum命令安装wgt命令 ...
- centos8平台安装redis6.0.1
一,redis的官网: https://redis.io/ redis6于5月3日正式发布,它的新增功能: acl 多线程io cluster proxy resp3协议 本文演示redis6.0.1 ...
随机推荐
- 使用ensp搭建路由拓扑,并使用isis协议实现网络互通实操
转载请注明出处: 1.通过拓扑搭建如下拓扑: 其中R7.R8为L1,R6为L1/2,R9为L2. 2.配置isis实现网络互通 R7配置如下: [Huawei]isis 1 [Huawei-isis- ...
- How to Install Python on Linux
Summary Hostmonster uses the preinstalled version of Python that ships with CentOS. Because of this ...
- 校招零Offer要不要先找实习?
国庆前后被问到最多的问题是:"磊哥,我现在还是 0 Offer,要不要先去找个实习?",给大家看看部分截图. 同学 A: 同学 B: 同学 C: 其他还有一些截图,我这里就不一一贴 ...
- 【Unity3D】Cesium加载大地图
1 前言 Cesium 是一个地球可视化平台和工具链,具有数据切片.数据分发.三维可视等功能. Cesium 支持 JS.Unity.Unreal.O3DE.Omniverse 等平台,框架如 ...
- 一个vuepress配置问题,引发的js递归算法思考
前言 这两天在尝试用语雀+ vuepress + github 搭建个人博客. 小破站地址 :王天的 web 进阶之路 语雀作为编辑器,发布文档推送 github,再自动打包部署,大概流程如下. 问题 ...
- Fiddler安装,使用及汉化教程
Fiddler安装及汉化教程 一.下载安装 1.下载 官网链接:https://www.telerik.com/download/fiddler 左侧填写用途,邮箱及城市,然后下载就可以 左侧下载即D ...
- 如何打开关闭Edge鼠标手势
概述 今天突然发现edge有了一个鼠标手势,用起来不是很适应,所以决定将其关掉. 操作步骤 点击edge右上角的三个点 在下拉菜单中选择设置 点开设置之后出现如图所示的界面,然后选择外观 往下面拉页面 ...
- Codeforces Round 856 (Div. 2)C
C. Scoring Subsequences 思路:我们想要找到满足的最大值的长度最长的的区间,因为单调不减,所以更大的数一定在最大值的里面包含,所以我们用两个指针维护这样一个满足当前i的最大值区间 ...
- PTA乙级1038C++哈希解法
#include"bits/stdc++.h" using namespace std; int main() { int a,b[105]={0}; long i,n,K; ci ...
- Wonder8.promotion营销规则引擎,轻松搞掂千变万化的营销玩法
超过10年没有更新过内容了,不知道现在园子的氛围这类文章还适不适合放首页 想着整点内容,也是支持园子! 旺德發.营销 引擎 概述 为了广泛支持营销活动的复杂与灵活,Wonder8.promotion( ...