快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → Redis内存缓冲区

Redis内存缓冲区

时间:2022-09-18 21:51:34人气:作者:快盘下载我要评论

00、redis内存缓冲区

对于一个DBA来说,"缓冲区"的概念不难理解,缓冲区是为数据的输入输出做缓冲的,从数据库的角度看,它是防止数据库的数据传输速度和客户端的处理消费速度不一致,导致数据库或者客户端阻塞的一块内存区域。

今天来看Redis以及业务客户端中常见的内存缓冲区。

01、客户端的输入和输出缓冲区

Redis服务器给每个客户端的连接都设置了一个输入缓冲区和输出缓冲区,客户端的命令先进入输入缓冲区,Redis再从缓冲区中拿到数据,处理完成之后,再写入输出缓冲区,然后客户端从输出缓冲区中获取数据。

Redis内存缓冲区

1.1 输入缓冲区溢出情况?

Redis中输入缓冲区在下面2种情况下有溢出风险:

a、写入了bigkey

b、服务器出现了阻塞情况,无法正常处理输入的请求

输入缓冲区一旦溢出,Redis就会关闭这个客户端的连接。如果连接数过多,超过了Redis内置的MaxMemory参数配置,就会自动触发数据淘汰。淘汰策略一般使用Maxmemory-policy参数控制,这里不赘述。

可以使用Redis中的内置命令client list来查看redis每个client的输入缓冲区使用情况:

redis> client list
addr=10.xx.xx.xx:41524 fd=45 idle=65081 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=hgetall
addr=10.xx.xx.xx:42353 fd=82 idle=65081 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=hgetall
addr=10.xx.xx.xx:30604 fd=133 idle=1835117 flags=S db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events= cmd=syncfrom
addr=10.xx.xx.xx:17294 fd=8 idle=1 flags=N db=0 sub=0 psub=0 qbuf=0 obl=0 oll=0 events=r cmd=publish

其中

qbuf就是目前已经使用的输入缓冲区的字节数。

qbuf-free,表⽰输⼊缓冲区尚未使⽤的⼤⼩,这个案例中没有。

cmd是指执行的命令,例如hgetall

1.2 能否手工调整输入缓冲区?

不能,Redis基于下面2个考虑,不支持这个功能。

第一:Redis中,对于输入缓冲区的上限设置为1GB,这个值已经很大了,考虑到Redis可能同时并发多个连接,如果某个连接超过这个值,那么该连接应该是发生了异常情况;

第二:过大的缓冲区情况下,多个客户端的就会占用大量内存,有可能导致Redis直接崩溃

1.3 输出缓冲区溢出?

Redis的输出缓冲区分为2个部分,其中,一部分内容是用来存储OK等响应信息,另一部分是一个可以动态增加的缓冲空间,可以用来存储响应的结果。例如keys * 命令的结果

输出缓冲区溢出的场景分为3中:

a、还是bigkey,这次是返回了bigkey,占用了大量的内存

b、执行了监控命令monitor,通常会刷屏。

这个命令会持续占用输出缓冲区,直到溢出,通常情况下,线上开启monitor的时间不要太长。

c、缓冲区大小太小。

这个缓冲区的大小,其实可以通过参数来控制client-output-buffer-limit,具体的参数大家可以自查。

02、主从复制的缓冲区

主从复制过程中,分为全量复制和增量复制,这两种情况下,稍有不同,这里简单分析下。

全量同步

主节点向从节点传递RDB文件的同时,会继续接受客户端上的写请求,此时这些请求就写入了复制缓冲区中。等到RDB文件传输完毕后,再把这些命令写入从节点中。主节点会向每个从节点都维护这么一个复制缓冲区,来保证数据同步。画图如下:

一旦这个复制缓冲区溢出,则主从的全量复制也会断开。

所以,主节点的数据量不要太大,如果太大,传输RDB的时间就会很长,导致写命令堆积超过复制缓冲区,最终复制无法建立。

增量同步

主节点把客户端的的写命令同步给从节点的时候,会先将这些命令写入到复制积压缓冲区中,一旦从节点发生网络闪断,可以从复制积压缓冲区中读取之前的复制偏移位点,快速重建复制。

数据库

复制积压缓冲区是一个环形区域,类似mysql的redo log或者MongoDB的Oplog一样,一旦从节点网络断开时间过长,复制积压缓冲区滚动满一圈,则无法重新建立复制关系,需要重新全量同步数据。

Redis中,使用repl_backlog_size这个参数控制复制积压缓冲区的值。

相关文章

  • 一步步带你设计MySQL索引数据结构

    一步步带你设计MySQL索引数据结构,想想我们生活中的例子,比如新华字典,我们有一个目录,目录根据拼音排序,内容包含了汉字位于字典中具体的的页码。聪明的你肯定也想到了,我们也可以借鉴这种思想,建立一个MySQL的目录,叫做“索引”。...
  • 影刀连接Mysql数据库

    影刀连接Mysql数据库,影刀配置连接mysql数据库基础版...

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。