Redis进阶底层原理- 缓冲区

news2024/11/26 2:52:03

Redis中使用了很多缓冲区,在redis各个环节起到了非常核心的作用。下面来一一介绍一下:

输入输出缓冲区(客户端缓冲区)

Redis中的输入输出缓冲区是为了平衡客户端发送命令和服务端处理命令的速度差异,如果客户端发送指令速度大于服务端处理速度,那么就会缓冲区的溢出,严重的内存问题。所以输入输出缓冲区就是在接受指令和返回数据上进行了限制,一旦溢出就会进行断开客户端连接操作,这也是Redis的一种内存保护机制

Redis会为每个客户端创建一个输入缓冲区和一个输出缓冲区,它们都属于客户端缓冲区,在接受客户端指令时,会将指令放入输入缓冲区,redis后续会从缓冲区提取指令执行,执行完成后返回数据回存入输出缓冲区。
可以通过client list 来查看客户端信息,其中包括了一些缓冲区的容量信息。

 客户端分类:

在Redis中客户端主要分为3中:
1、普通客户端:就是常规应用程序客户端,比如jedis、java程序连接的这种。
2、主从复制中slave:在主从复制模式中的从节点。
3、发布订阅模式频道的客户端

输入缓冲区

Redis服务端对于每个redis客户端(以上3钟)输入缓冲区默认大小为1gbredis不支持修改配置该大小,一般来说1gb的指令已经足够我们使用了。

溢出了会怎么样?
如果输入缓冲区溢出了,则就会断开客户端的连接,保障服务器内存不会标准,是一种保护机制。

导致输入溢出场景?
1、出现key很大指令(bigkey),比如特别大的pipeline等,同时客户端指令请求过快的情况下。
2、服务器资源不足等一些情况导致服务端处理速度很慢,无法快速的接受并处理掉输入缓冲区中的数据,导致缓冲区积累。

应对方式是什么?
针对以上两种溢出场景,我们可以思考应对方式:
1、避免bigkey的出现,同时保障服务器有足够的响应速度。
2、可以通过分区集群的方式,将过多的请求负载,减轻单个服务器CPU压力和内存压力。

输出缓冲区

Redis对于不同客户端的输出缓冲区有不同容量的默认配置,同时支持容量限制的修改
容量限制配置和默认大小:
1、普通客户端:client-output-buffer-limit normal 0 0 0  默认不限制大小。
   因为客户端数据量大小是不确定的,所以如果有所限制,可能会造成不可用。
2、主从模型slave
client-output-buffer-limit replica 256mb 64mb 60  默认如果缓冲区超过       256mb,或者持续60s内存超过64mb,则断开客户端连接。当前缓冲区也就是复制缓冲区
3、发布订阅频道客户端:
client-output-buffer-limit pubsub 32mb 8mb 60

AOF缓冲区(服务器端缓冲区)

AOF缓冲区作用于类似于输入缓冲区,只不过是作用在AOF持久化过程,Redis进行AOF持久化时,并不是直接将指令Append到AOF文件尾部,而是将指令以Redis协议写入到AOF缓冲区中,Redis会根据同步规则(appendsync)的配置,将指令从内存中写入到磁盘。

 1、临时存储指令,然后在合适的时机写入磁盘,比如1秒一次,可以减少每次直接写入磁盘的IO开销,也提高了写入性能。
2、AOF可以将多写操作合并写入磁盘,减少了IO开销。
3、通过合并指令写入磁盘,也降低了存储的碎片化。提高了磁盘利用率。

AOF重写缓冲区(服务器端缓冲区)

AOF重写缓冲区(aof_rewrite_buffer)是在AOF文件bgrewriteaof过程中使用到的缓冲区,它主要保障了在重写过程中新增指令的一致性在重写时,主进程除了将指令写入AOF缓冲区,同时还会将指令写入AOF重写缓冲区,等重写完成之后,会将重写缓冲区中的指令追加到AOF文件尾部,从而保障重写过程中新写入的指令不会丢失

 复制缓冲区(客户端缓冲区)

复制缓冲区是Redis主从复制模型中,在全量数据同步过程中新的数据产生后,从slave和主数据一致性的保障方式。它使用的就是输出缓冲区,其配置就是client-output-buffer-limit replica 256mb 64mb 60,所以它也是一种客户端缓冲区。

在主从全量数据同步过程中,主进程会将新产生的数据写入到复制缓冲区中,等到RDB同步完毕之后,将缓冲区中数据发送给从节点,从而保障了从节点数据的一致性。

 复制缓冲区溢出
当RDB时间过长,或者复制过程中写入操作过多,导致复制缓冲区积累数据过多导致溢出,此时redis会断开客户端连接

溢出解决办法?
1、增大复制缓冲区的大小,但是同时也需要考虑到maxmemory限制。
2、减小RDB文件大小,可以通过分区集群的方式降低当个主节点的存储量,从而减小RBD大小。

复制积压缓冲区(服务端缓冲区)

复制积压缓冲区是主从复制模型中,redis实现增量数据同步的一种环形缓冲区。它主要记录的每次数据同步的ID和offset,当从节点断线重连后,发起同步请求时,主节点通过对比从节点发送来的ID和offset在复制积压缓冲区中是否存在,来判定是否进行增量数据同步,
如果复制积压缓冲区中存在发送过来的offset,则将缓冲区中剩余数据发送给从(增量同步),否则进行全量同步。

原图下载:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java用 postman输入 数字 会加上单引号 和逗号,方便查询

java用 postman输入 数字 会加上单引号 和逗号,方便查询 /*** 输入12575726* 891006* 12575726* 891006* 返回* 12575726,* 891006,* 12575726,* 891006* 方便查询数据* param data* return*/RequestMapping(value "l…

MySQL查看系统性能参数、统计SQL的查询成本last_query_cost的使用

1、查看MySQL系统性能参数 在MySQL中,可以使用SHOW STATUS语句查询一些MySQL数据库服务器的性能参数、执行频率。 语法如下: SHOW [ GLOBAL | SESSION] STATUS LIKE 参数; 一些常用的性能参数如下: Connections:连接MySQL服…

《银行法律法规》三、银行管理——2、公司治理、 内部控制与合规管理

第二章 公司治理、 内部控制与合规管理 第一节 公司治理 考点1 银行公司治理概述★★ 商业银行公司治理是指股东大会、 董事会、 监事会、 高级管理层、 股东及其他利益相关者之间的相互关系, 包括组织架构、 职责边界、 履职要求等治理制衡机制, 以…

从零到精通!50个必懂IT术语,让你成为行业翘楚!

您刚进入IT行业?不必惊慌!我们为您整理了50个最常见的IT术语,从ICT到ITIL再到SLM,全方位解读,让您快速掌握这些关键概念。更令人兴奋的是,我们将向您介绍轻易云数据集成平台,它是您在数字化转型…

Redis进阶底层原理 - 分区算法方案

Redis分区是指将数据分散到不同的Redis实例,降低单个Redis实例内存和高并发请求的压力。为什么要做分区:目前来说前面所学知识都是基于Redis单实例上进行的,及时是哨兵模式也只是保证了单个Redis实例的可用性。当内存数据越来越多时单个Redis…

BOM编程

十四、BOM和DOM编程 windows对象 常见方法 _self:在当前页面打开窗口 _blank:打开一个新的选项卡 第一个参数是x轴,一般没有横向滚动条,都是操作第二个参数 history对象 属性:一般用不到 方法: 01.histor…

PCB规则设置

PCB设计规则 网络class设置间距规则设置线宽规则过孔规则设置铺铜规则设置其他规则设置 网络class设置 间距规则设置 进入规则设置 线宽规则 新建线宽选项,电源类 过孔规则设置 铺铜规则设置 其他规则设置

Django ORM Field源码解读

已models.py的CharField字段代码为起点 secret_id = models.CharField("secret_id", max_length=256, default="") 构造方法中,会去调父类Field 的构造方法,而后向 CharField 的验证器列表 中添加一个 MaxLengthValidator 对象,用于…

leecode 数据库:1084. 销售分析III

导入数据: Create table If Not Exists Product (product_id int, product_name varchar(10), unit_price int); Create table If Not Exists Sales (seller_id int, product_id int, buyer_id int, sale_date date, quantity int, price int); Truncate table Prod…

Elasticsearch中查询性能优化

Elasticsearch是一种流行的搜索引擎和分布式文档存储解决方案,它的高效性能和可伸缩性使其成为许多应用程序的首选存储引擎。在工作中,优化Elasticsearch的检索性能是一个非常重要的任务,可以大大提高应用程序的响应速度和用户体验。下面我们…

0131 物理层2

目录 2.物理层 2.2传输介质 2.3物理层设备 2.2,2.3部分习题 2.物理层 2.2传输介质 2.3物理层设备 2.2,2.3部分习题 1.利用一根同轴电缆互连主机构成以太网,则主机间得通信方式为() A.全双工 B.半双工 …

PTA天梯赛的赛场安排

天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满…

401 - 未授权: 由于凭据无效,访问被拒绝。

这种原因通常因为将目标文件夹建立在C盘(系统盘),系统盘权限比较高。 解决方案:将 C:\Windows\Temp 设置 User 写权限即可。

简单版本视频播放服务器V2

简单版本视频播放服务器V2 一直想做个家用版本的家庭影院,通过这个服务器可以给电脑,平板,手机等设备提供直接播放电影的作用,通过浏览器就是可以访问电脑里面的视频,实现简单的家庭版本服务了。 备注注意 &#xff1a…

基于linux下的高并发服务器开发(第二章)- 2.4 父子进程虚拟地址空间情况

01 / 进程创建 #include <sys/types.h> #include <unistd.h> pid_t fork(void); 函数的作用&#xff1a;用于创建子进程。 返回值&#xff1a; fork()的返回值会返回两次。一次是在父进程中&#xff0c;一次是在子进程中。 在父进程中返回…

【活动回顾】Data + AI 时代下的云数仓设计 @Qcon

此前&#xff0c;由 InfoQ 中国举办的 QCon 全球软件开发大会在广州圆满落幕。本次大会有近百位国内外技术大咖现场分享前沿技术案例与创新实践&#xff0c;共有十二个专题&#xff0c;近五十余场分享。Databend Cloud 联合创始人张雁飞受邀参与了此次技术盛宴&#xff0c;并在…

SpringBoot整合gRPC - proto3 -- 简单明了

项目结构 pom引入(parent中引入即可) <properties><net-devh-grpc.version>2.14.0.RELEASE</net-devh-grpc.version><os-maven-plugin.version>1.6.0</os-maven-plugin.version><protobuf-maven-plugin.version>0.5.1</protobuf-mave…

基于flask框架的用户注册页面实例

文件框架 app.py文件 from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return register()# 申请注册页面 app.route(/register, methods["GET"]) def register(): # put applications code herereturn render_tem…

element-plus源码学习后,我了解到多种多样的写法

文章封面来自于深圳湾桥&#xff0c;很漂亮&#xff01; 本文是阅读源码之后&#xff0c;学习到一些新写法&#xff0c;平常业务开发也可以用起来。在我看来&#xff0c;阅读源码&#xff0c;不但能知道该框架的底层原理&#xff0c;出现bug时&#xff0c;可以快速排查和修复&…

如何使用unittest批量管理Python接口自动化测试用例?

我们日常项目中的接口测试案例肯定不止一个&#xff0c;当案例越来越多时我们如何管理这些批量案例&#xff1f;如何保证案例不重复&#xff1f;如果案例非常多&#xff08;成百上千&#xff0c;甚至更多&#xff09;时如何保证案例执行的效率&#xff1f;如何做&#xff08;批…