Loading

Redis三大缓冲区

三大缓冲区

1、客户端缓冲区

输入缓冲区会先暂存客户端发送过来的命令,Redis 主线程从输入缓冲区中读取命令,进行处理。当 Redis 主线程处理完数据后,会把结果写入到输出缓冲区,再从输出缓冲区返回给客户端。
image

1-1、输入缓冲区
缓存区溢出原因:
1、写入了BigKey,如一次性写入了百万级别的哈希或集合数据,超过了缓冲区的大小
2、服务端处理请求的速度过慢导致阻塞,无法及时处理请求,使得客户端发送的请求在缓冲区内越积越多。
1-2、输出缓冲区
缓存区溢出原因:
1、返回BigKey的大量结果
2、执行了某些不合理的命令
3、缓冲区大小设置不合理

2、复制缓冲区

发生在主从复制过程
2-1、复制缓冲区

image
全量复制过程中:主节点在向从节点传输 RDB 文件的同时,会继续接收客户端发送的写命令请求。这些写命令就会先保存在复制缓冲区中,等 RDB 文件传输完成后,再发送给从节点去执行。主节点上会为每个从节点都维护一个复制缓冲区,来保证主从节点间的数据同步。

溢出原因:
	1、主库传输 RDB 文件以及从库加载 RDB 文件耗时长,同时主库接收的写命令操作较多
避免:
	1、可以控制主节点保存的数据量大小,这样可以让RDB文件的传输以及从库加载时间变快,以避免复制缓冲区累积过多命令
	2、避免一个主节点有过多的从节点
2-2、复制积压缓冲区

image
增量复制时,主节点和从节点进行常规同步时,会把写命令也暂存在复制积压缓冲区中。如果从节点和主节点间发生了网络断连,等从节点再次连接后,可以从复制积压缓冲区中同步尚未复制的命令操作。

溢出原因:
	缓冲区大小设置不合理
避免:
	合理设置缓冲区大小
	缓冲区大小=(主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小)* 2

3、AOF缓冲区

3-1、AOF缓冲区
1、当Redis进行持久化时,会先将客户端传来的命令存放在AOF缓冲区,再去根据具体的策略(always、everysec、no)去写入磁盘中的aof文件中
3-2、AOF重写缓冲区
在Redis进行持久化的过程中,首先会将接收到的指令放到AOF缓冲区中;
当需要进行AOF重写时,主进程会fork一个子进程进行AOF重写,此时主进程还要继续接收客户端传来的指令,此时这些指令就会存放在AOF重写缓冲区中;
当AOF重写完成后,会给主进程发送信号,主进程会根据这个信号调用信号回调函数,去将AOF重写缓冲区中的指令追加到aof文件中,并将原来的aof文件替换,来保证数据的一致性。

总结

对于缓冲区溢出其实主要有两种原因,一是缓冲区大小不够,二是消费者处理的速度太慢,而生产者生产的太快,导致大量内容积压在缓冲区,进而导致溢出。
解决方案就可以通过调整缓冲区的大小,或者调整生产者与消费者之间生产与处理消息的速度使其处于一个相对平衡的状态。特殊情况下可能需要用到redis的切片集群。

image

posted @ 2021-07-27 11:30  mainwoodの慢屋  阅读(705)  评论(0编辑  收藏  举报