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 ...
随机推荐
- 临时表、视图与系统函数_Lab2
MySQL数据库操作 Lab1.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSys ...
- [NISACTF 2022]checkin
题目看上去似乎只是一个简单的get传参,但复制了一下代码,发现不对 这些代码中间还有隐藏的字符 在记事本里面就看到了神奇的字符 就将这些隐藏起来的进行urlencode编码一下 复制这个进行编码,得到 ...
- kubernetes 概述
云原生的发展 云原生是一条最佳路径或者最佳实践.更详细的说,云原生为用户指定了一条低心智负担的.敏捷的.能够以可扩展.可复制的方式最大化地利用云的能力.发挥云的价值的最佳路径.因此,云原生其实是一套指 ...
- bootstrap响应式原理
Bootstrap 框架的网格系统工作原理如下:1 .数据行 (.row) 必须包含在容器( .container )中,以便为其赋予合适的对齐方式和内距 (padding) . 如: <div ...
- LAMP搭建流程与应用
LAMP搭建流程 1.环境准备 [root@localhost opt]# systemctl stop firewalld.service [root@localhost opt]# seten ...
- P8368 [LNOI2022] 串 题解
题目链接 题目分析 题目要求我们构造一个最长的 \(T\) 序列,我们首先从每个 \(T_i\) 入手,思考如何安排才能合法. 容易观察到对于每个 \(T_i\),合法的 \(T_{i-1}\) 有两 ...
- langchain中的chat models介绍和使用
简介 之前我们介绍了LLM模式,这种模式是就是文本输入,然后文本输出. chat models是基于LLM模式的更加高级的模式.他的输入和输出是格式化的chat messages. 一起来看看如何在l ...
- 生成ios证书最简单的方法
使用了hbuilderx的uniapp来开发app很方便,但是官网的文档,生成ios的私钥证书却需要使用mac电脑来生成,假如没有mac电脑就无法使用教程的方法来生成ios证书. 因为hbuilder ...
- JavaScript高级程序设计笔记02 HTML中的JavaScript
HTML中的JavaScript <script>元素 形式 行内 其中的代码会被从上到下解释.计算完成之前,页面其余内容不会被加载,也不会被显式. 外部 下载与解析都会阻塞HTML解析, ...
- Verilog HDL门级建模
Verilog HDL内部定义了12个基本门级元件可以直接用,用这些门级原件直接对逻辑图进行描述,称为门级建模. 每个门输入可能是逻辑0,逻辑1,不确定态x和高阻态z四个值之一. 1.多输入门 主要有 ...