前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis内存缓冲区

Redis内存缓冲区

作者头像
AsiaYe
发布2021-08-05 16:11:01
9090
发布2021-08-05 16:11:01
举报
文章被收录于专栏:DBA随笔DBA随笔

00、Redis内存缓冲区

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

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

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

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

1.1 输入缓冲区溢出情况?

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

a、写入了bigkey

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

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

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

代码语言:javascript
复制
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这个参数控制复制积压缓冲区的值。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 00、Redis内存缓冲区
  • 01、客户端的输入和输出缓冲区
  • 02、主从复制的缓冲区
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档