Redis进阶底层原理- 缓冲区

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.mzph.cn/news/4767.shtml

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

相关文章

一本通1910:【00NOIP普及组】计算器的改良题解

今天是编程集训的第二天,也是我来到CSDN整整1年。感谢所有阅读过我的文章的人,谢谢。 今天的比赛难度略低于昨天,但这道题也卡了我好久。 进入正题 题目: 题目描述: NCL是一家专门从事计算器改良与升级的实验室&a…

手把手带你实现ChatGLM2-6B的P-Tuning微调

参考文献:chatglm2ptuning 注意问题1:AttributeError: ‘Seq2SeqTrainer’ object has no attribute is_deepspeed_enabl torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 可能是版本太高,可以参考chatglm2的环境

mysql笔记

目录 1、root用户密码忘记 2、SQL的分类 2.1、DQL数据查询语言 前言 2.1.1、设置别名 2.1.2、去除重复行 2.1.3、空值参与运算 2.1.4、着重号 2.1.5、显示表结构 2.1.6、算数运算符 2.1.7、比较运算符 2.1.8、逻辑运算符 2.1.9、位运算符 2.1.10、 模糊查询 2.1.…

基于Java+SpringBoot+Vue前后端分离校园管理系统详细设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2,3 尝试暴库爆表 这时候进行尝试堆叠注入,创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

分布式应用之zookeeper集群+消息队列Kafka

一、zookeeper集群的相关知识 1.zookeeper的概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能…

一级分类全覆盖!安全狗入选《嘶吼2023网络安全产业图谱》

7月10日,嘶吼安全产业研究院联合国家网络安全产业园区(通州园)正式发布《嘶吼2023网络安全产业图谱》。作为国内云原生安全领导厂商,安全狗入选图谱中的多个细分领域。 据悉,本次《嘶吼2023网络安全产业图谱》采用了市…

JavaScript——基础知识及使用

初识 JavaScript JavaScript (简称 JS) 是世界上最流行的编程语言之一.一个脚本语言, 通过解释器运行.主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 的能做的事情: 网页开发(更复杂的特效和用户交互)网页游戏开发服务器开发(node.js)桌…

Pandas Groupby:在Python中汇总、聚合和分组数据

GroupBy是一个非常简单的概念。我们可以创建一个类别分组,并对这些类别应用一个函数。这是一个简单的概念,但它是一种在数据科学中广泛使用的非常有价值的技术。在真实的的数据科学项目中,您将处理大量数据并一遍又一遍地尝试,因此…

HUAWEI Mate X3:内外屏双享,折叠影像诠释精彩

HUAWEI Mate X3是全球首款四曲折叠手机,轻薄实力派。它采用了独创的寰宇舷窗设计,内外双屏高清呈现均支持120Hz疾速高刷,10.7亿色彩显示,获得德国莱茵TV色准和准确色彩投射双认证。无论是看视频、玩游戏、办公学习,还是…

T5模型: Transfer Text-to-Text Transformer(谷歌)

🔥 T5由谷歌发表于2019,《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,最终版本发布在:JMLR。 一句话总结T5: 大一统模型,seq2seq形式完成各类nlp任务,大数据集…

JAVA15个常见面试题

下面是一些常见的Java面试题及答案: Java中的值传递和引用传递有什么区别? Java中的参数传递方式都是值传递,但是对于引用类型的参数,传递的是对象的引用副本。 什么是Java中的面向对象编程? 面向对象编程是一种编程范…

推荐系统-基于标签的Top-N个性化推荐实现

随着移动互联网的快速发展,UGC标签系统受到越来越多推荐应用,标签不但能反映用户的兴趣又能描述物品的本身特征。现有的标签推荐算法没有考虑用户的连续行为所产生的影响,于是人们提出了一种基于标签的个性化推荐算法。该算法将〈用户-标签-物…

谷歌云构建漏洞容易引发潜在的供应链攻击

云安全公司Orca Security在谷歌云构建(Google Cloud Build)服务中发现了一个关键的设计漏洞,该漏洞会让攻击者的权限升级,使他们可以在未经授权的情况下访问谷歌构件注册表(Google Artifact Registry)代码库…

VoIP监控工具有什么作用

VoIP 监控工具利用思科的 IPSLA 技术生成合成流量并监控客户端体验的呼叫质量。与被动监控VoIP指标相反,IPSLA技术允许IT管理员主动并在潜在问题发生之前检测到它们,这使组织能够轻松遵守严格的SLA指标。 思科 IPSLA 技术在两台设备之间创建流量&#x…

这样创建客户帮助中心,效果超好!

创建一个有效的客户帮助中心是为了为客户提供优质的支持和服务。在这个数字化时代,客户期望能够快速找到所需的信息,并得到准确和及时的解答。本文将分享创建有效客户帮助中心的最佳实践,帮助您提供出色的客户体验并提升客户满意度。 1. 了解…

Python 字典 get()函数使用详解,字典获取值

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 get函数使用详解 1、设置默认返回值2、嵌套字典取值3、get() 和 dict[key] 的区别…

linux centos7 静默安装 oracle 11g,【亲测有效】,包含远程连接、提供安装包

Centos7 安装oracle11g 环境准备 操作系统 centos7 oracle版本 oracle11g 终端软件 MobaXterm 192.168.46.61 oracleMaster 安装包 网盘地址 一、安装前准备 1、关闭selinux [rootoracleMaster ~]# vim /etc/selinux/config修改 SELINUX 为 disabled # This file controls …

java导出pdf(纯代码实现)

java导出pdf 在项目开发中,产品的需求越来越奇葩啦,开始文件下载都是下载为excel的,做着做着需求竟然变了,要求能导出pdf。导出pdf倒也不是特别大的问题关键就是麻烦。 导出pdf我知道的一共有3中方法: 方法一&#xff…

STM32定时器中断的使用示例

STM32定时器中断的使用示例 前言硬件和软件cubemx使能定时器中断中断服务函数案例输出结果 前言 上一篇博客实现了定时器输出pwm,这篇接着上次的工程,在上次的工程上做简单的配置即可 硬件和软件 硬件使用的是stm32h750vbt6;软件用到了stm…