redis 缓冲区详解(性能优化缓冲区优化)

目录

前言

客户端输入缓冲区

输出缓冲区

集群缓冲区

全量复制缓冲区问题

增量复制缓冲区问题


前言

在我的《Redis 为啥那么快》这篇文章中,详细总结了Redis 为啥那么快。今天当我要详细阐述Redis 的缓冲区时,意识到应该加上Redis 的缓冲区。我们假设没有Redis 的缓冲区,客户端向服务端发送数据,必须等待Redis 的服务端去处理,大家都知道Redis 是单线程的,虽然这么说不是很准确,为了描述,也只好这么说了。如果没有及时处理,那客户端不就阻塞了吗,有多个客户端,redis 阻塞的时间不是更长了吗?现在我们有了缓冲区,客户端就可以把命令提交到客户端缓冲区,然后去输出缓冲区接收数据的返回,服务端直接从客户端读取数据,不用客户端持续等待。是不是就有点像Redis客户端和redis 服务端解绑了一样,谁都不知道谁的存在,只需要与中间的缓冲区交互就可以了。

如果我们使用不当,缓冲区可能会溢出,就会丢失数据。不给缓冲区设置大小,随着缓冲区的增大,最终会耗尽所有的内存,Redis 也就崩溃了。

下面我将从输入缓冲区,以及输出缓冲区,对于输出缓冲区,又从单个Redis 实例 到集群阐述这个问题。

为了描述客户端输入和输出缓冲区,我先画个图:

图1

客户端输入缓冲区

根据图1可以看到一个客户端对应一个输入缓冲区和输出缓冲区。Redis 客户端把命令写到输入缓冲区,Redis 主线程从输入缓冲区读取命令,在把返回的信息写到输出缓冲区,Redis 客户端从输出缓冲区读取响应命令。

我们上面讲到过,缓冲区不可能是无限大的,它是有大小的,就可能出现溢出。

客户端缓冲区的溢出有下面几种情况

  1. 写入了bigkey,比如写入的集合数据达到了百万级

  2. Redis 主线程发生阻塞,这个问题,以前文章阐述过,客户端不断向输入缓冲区写入命令,此时主线程无法处理,就溢出了

可以通过下面这种方式查看输入缓冲区的使用情况:client list

通过上图可以看到每个客户端对应一行数据,包括客户端的ip 地址,以及输入缓冲区使用了大小,输入缓冲区尚未使用的大小。

cmd,客户端最新执行的命令,qbuf 输入缓冲区已经使用的大小, qbuf-free 缓冲区尚未使用的大小。这个客户端分配的缓冲区大小 = qbuf+qbuf-free

如果 qbuf-free 很小的话,下次的命令大于 qbuf-free 的话,此时redis 又不能及时处理输入缓冲区数据时,就会造成输入缓冲区溢出,那么Redis 就会关闭这个客户端。

  1. Redis 服务器端不止一个客户端,当多个客户端连接占用的内存总量>redis 的 maxmemory 配置时,就会触发Redis 数据淘汰。

  2. 如果没有设置maxmemory时,那么多客户端连接可能会耗尽服务器所有内存,服务器奔溃了。

对于第1点,可能会说调大输入缓冲区,不好意思,没有这个参数可以设置,都是redis 代码写死的,大概是1G,不同版本也可能会不一样,记住是无法调整的,既然无法调整,那就是写命令,避免写入bigkey,避免redis 主线程阻塞 第2点,就是集群,现在都是这么干的

输出缓冲区

输出缓冲区有两部分组成:一部分,是一个大小为 16KB 的固定缓冲空间,用来暂存 OK 响应和出错信息;另一部分,是一个可以动态增加的缓冲空间,用来暂存大小可变的响应结果。

有下面几种情况下,输出缓冲区会溢出:

  1. 服务器端返回 bigkey 的大量结果,把溢出缓冲区内存打爆

  2. 执行了 MONITOR 命令 就会持续输出监控命令到输出缓冲区

  3. 输出缓冲区设置的太小,也就是 client-output-buffer-limit

输出缓冲区是如何设置的,可以用命令:client-output-buffer-limit,如下图

normal ,pubsub , slave 分布是下列,我分别讲解 分别是常规和 Redis 服务器端进行读写命令交互的普通客户端,(normal) 以及订阅了 Redis 频道的订阅客户端. (pubsub) 在 Redis 主从集群中,主节点上也有一类客户端(从节点客户端)用来和从节点进行数据同步 (slave)

普通客户端输出缓冲区设置 client-output-buffer-limit normal 0 0 0 第 1 个 0 设置的是缓冲区大小限制,第 2 个 0 和第 3 个 0 分别表示缓冲区持续写入量限制和持续写入时间限制。这个一般都会这么设置 普通客户端写入命令,都会等待Redis 返回,在发送下一个命令,不是大的bigkey,输出缓冲区不会阻塞,也不会溢出。所以这么设置

订阅客户端设置缓冲区大小,为了好描述,这里用单位M client-output-buffer-limit pubsub 8mb 2mb 60 订阅客户端和普通客户端不太一样,订阅客户端不是阻塞的,如果向频道发送大量的数据就会占用较多的输出缓冲区 8Mb 输出缓冲区大小,2mb 60 表示60秒写2MB 的数据。这两个条件只要满足一个,客户端就会关闭连接

集群缓冲区

主从集群间数据复制包括两种全量复制和增量复制。这两种复制都会用到缓冲区,这两个问题,我们分开讨论。

全量复制缓冲区问题

全量复制指的是从节点与主节点第一次连接,主节点会把主节点的RDB 传给从节点去执行。这就是全量复制。此时主节点会继续接收客户端的写请求,而这些请求会先保存在复制缓冲区中,等RDB传输完成后,在把复制缓冲区的命令给从节点,如果有多个从节点,那就有多个复制缓冲区。用来保证所有主从节点间数据同步。

那么如果在全量复制时,从节点接收和加载 RDB 较慢,同时主节点接收到了大量的写命令,写命令在复制缓冲区中就会越积越多,最终导致溢出。

其实我们可以看到主节点的复制缓冲区就是从节点的输出缓冲区,如果这个缓冲区溢出了,那么主节点也会直接关闭和从节点进行复制操作的连接,导致全量复制失败。

如何避免了复制缓冲区溢出,我感觉有两点:

  1. 控制主节点保存数据量的大小,一般会把主节点数据量控制在2-4GB,这样,RDB 文件小,主从同步快,同时也不至于复制缓冲区因为写了太多而没有及时传给从节点导致复制缓冲区溢出

  2. 可以通过 client-output-buffer-limit 命令设置复制缓冲区合适的大小。主要是根据,主从节点数量大小、主节点的写负载压力和主节点本身的内存大小。

  3. 还有一个问题我要提一下,复制缓冲区的内存开销是每个从节点客户端输出缓冲区占用内存的总和,这一点大家一定要记住。

可以这么设置:

client-output-buffer-limit slave 512mb 128mb 60

复制缓冲区大小是512mb,60秒写入128M。两个条件满足其中之一表示复制缓冲区溢出,此时全量复制失败了

所有从节点的客户端输出缓冲区之和是512mb

增量复制缓冲区问题

增量复制只会把主从库网络断连期间主库收到的命令,同步给从库。主节点把接收到的写命令同步给从库时,同时也会把这些命令写入 复制积压缓冲区。主从网络中断后,再次和主节点恢复连接后,从节点就会从复制积压缓冲区中,读取断连期间主节点接收到的写命令,进而进行增量同步。

首先我们要明白复制积压缓冲区是一个大小有限的环形缓冲区。当主节点把复制积压缓冲区写满后,会覆盖缓冲区中的旧命令数据。如果从节点还没有同步这些旧命令数据,就会造成主从节点间重新开始执行全量复制。

其次可以 repl_backlog_size 调整复制积压缓冲区的大小,这个大小怎么设置呢,根据下面的规则:

这个参数和所需的缓冲空间大小有关。缓冲空间的计算公式是:缓冲空间大小 = 主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小。在实际应用中,考虑到可能存在一些突发的请求压力,我们通常需要把这个缓冲空间扩大一倍,即 repl_backlog_size = 缓冲空间大小 * 2,这也就是 repl_backlog_size 的最终值。

好了,写到这里,有问题记得给我留言。

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

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

相关文章

01_04_JavaWEB03_XML、Tomcat、http

XML_Tomcat10_HTTP 参考尚硅谷再总结复习 一 XML XML是EXtensible Markup Language的缩写,翻译过来就是可扩展标记语言。所以很明显,XML和HTML一样都是标记语言,也就是说它们的基本语法都是标签。 可扩展 三个字表面上的意思是XML允许自定义…

VBA combox/listbox 控件响应鼠标滚轮事件

在vba中,我们在用户窗体中如果添加有combox控件,或者是listbox控件。正常情况下,combox 和 listbox 是不响应鼠标滚轮事件的,且默认的VBA控件中,也没有提供响应鼠标滚轮事件的方法和入口。如此以来,我们在c…

【毕设级项目】基于AI技术的多功能消防机器人(完整工程资料源码)

基于AI技术的多功能消防机器人演示效果 竞赛-基于AI技术的多功能消防机器人视频演示 前言 随着“自动化、智能化”成为数字时代发展的关键词,机器人逐步成为社会经济发展的重要主体之一,“机器换人”成为发展的全新趋势和时代潮流。在可预见的将来&#…

Adobe Photoshop 2024 v25.5.1 for mac 强大的图形编辑工具 兼容 M1/M2/M3

Mac毒搜集到的Adobe Photoshop 2024 v25.5.1 是一款强大的图形编辑和设计工具! v25.5.1版本AI生成式无法使用 应用介绍 Adobe Photoshop 2024是一款强大的图像处理软件,由Adobe公司开发。它可以用于编辑和处理照片、图形和其他类型的图像,包括设计、绘画…

Java双非大二找实习记录

先说结论:2.22→3.6线上线下面了七家,最后oc两家小公司,接了其中一个。 本人bg: 真名不经传双非一本,无绩点无竞赛无奖项无实习,23年12月开始学java。若非要说一点相关的经历,就是有java基础&…

XWPFDocument中XmlCursor的使用

类名&#xff1a; org.apache.xmlbeans Interface XmlCursor版本&#xff1a; 原xml代码&#xff1a; <w:p w14:paraId"143E3662" w14:textId"4167FBA7" w:rsidR"001506F2" w:rsidRPr"003F3D89" w:rsidRDefault"001506F2&qu…

Python3虚拟环境之virtualenv

virtualenv 在开发Python应用程序的时候&#xff0c;系统安装的Python3只有一个版本&#xff1a;3.7。所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果要同时开发多个应用程序&#xff0c;这些应用程序都会共用一个Python&#xff0c;就是安装在系统的Pyt…

【三】安装k8s+kuboard, 拉取harbor镜像并执行yml文件

自己的配置 我在尊云上两百多买了三台2c4g的服务器&#xff0c;其实买两台就够了。 修改服务网卡掩码 确保几台服务器内网之间可以ping通 以尊云为例&#xff0c;vi /etc/sysconfig/network-scripts/ifcfg-eth1 修NETMASK值为255.0.0.0&#xff0c;重启服务器&#xff0c;尝试…

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作

好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…

C# OpenCvSharp 图片批量改名

目录 效果 项目 代码 下载 C# OpenCvSharp 图片批量改名 效果 项目 代码 using NLog; using OpenCvSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_Demo { publi…

微信小程序仿QQ头像轮播效果

1、效果图 2、效果流程分析 1、第1个头像大小从1到0缩小的同时&#xff0c;第2个头像左移 2、上面动画结束后&#xff0c;延迟50ms&#xff0c;第3个头像从0到1放大 3、把头像列表顺序前移一位&#xff0c;并重置轮播状态&#xff0c;以此达到一个循环。然后继续第一个步骤 …

Java旋转矩阵

题目&#xff1a; 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵&…

wins10安装ffmpeg

官网下载 点击进入官网&#xff1a;ffmpeg&#xff0c;官网地址&#xff1a;https://ffmpeg.org/download.html 点击上图中Windows图标选中后下面显示的第一行进入如下界面&#xff0c;在release builds第一个绿框里面选择一个版本下载&#xff1a; 下载好之后解压后&#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PatternLock)

图案密码锁组件&#xff0c;以九宫格图案的方式输入密码&#xff0c;用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态&#xff0c;手指离开屏幕时结束输入状态完成密码输入。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#…

GO语言-切片底层探索(上)

目录 1.前言 2. 算法题目 错误代码 3. 错误分析 4.总结&#xff1a; 5.正确代码&#xff1a; 6.本地测试代码&#xff1a; 1.前言 今天在力扣上写算法&#xff0c;遇到了一个比较"奇怪"的错误。由于自己使用了递归切片&#xff0c;导致一开始没有看明白&…

力扣最热100题——56.合并区间

吾日三省吾身 还记得梦想吗 正在努力实现它吗 可以坚持下去吗 目录 吾日三省吾身 力扣题号&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 Java解法一&#xff1a;排序然后原地操作 具体代码如下 Java解法二&#xff1a;new一个list&#xf…

虚拟机中安装Win98

文章目录 一、下载Win98二、制作可启动光盘三、VMware中安装Win98四、Qemu中安装Win981. Qemu的安装2. 安装Win98 Win98是微软于1998年发布的16位与32位混合的操作系统&#xff0c;也是一代经典的操作系统&#xff0c;期间出现了不少经典的软件与游戏&#xff0c;还是值得怀念的…

安卓多个listView拖动数据交换位置和拖动

注意这里只是给出大概思路&#xff0c;具体可以参考修改自己想要的 public class MainActivity extends AppCompatActivity {private ListView listView1;private ListView listView2;private ArrayAdapter<String> adapter1;private ArrayAdapter<String> adapter…

研发效能DevOps: OpenEuler 部署 drone 持续集成平台

目录 一、实验 1.环境 2.OpenEuler 部署 drone 持续集成平台 二、问题 1.drone登录失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168.204.145&#xff08;动态&#xff09; 192.168.204.141&…

jenkins容器中安装python遇到问题

在Jenkins容器中安装配置Python时遇到问题 执行./configure --prefix/opt/python3/时遇到configure: error: no acceptable C compiler found in $PATH 这个问题就是缺少gcc编译环境。将gcc安装上即可&#xff1a; yum install -y gcc##前提是容器里的系统是cenos才可以&#…