Redis中使用了很多缓冲区,在redis各个环节起到了非常核心的作用。下面来一一介绍一下:
输入输出缓冲区(客户端缓冲区)
Redis中的输入输出缓冲区是为了平衡客户端发送命令和服务端处理命令的速度差异,如果客户端发送指令速度大于服务端处理速度,那么就会缓冲区的溢出,严重的内存问题。所以输入输出缓冲区就是在接受指令和返回数据上进行了限制,一旦溢出就会进行断开客户端连接操作,这也是Redis的一种内存保护机制。
Redis会为每个客户端创建一个输入缓冲区和一个输出缓冲区,它们都属于客户端缓冲区,在接受客户端指令时,会将指令放入输入缓冲区,redis后续会从缓冲区提取指令执行,执行完成后返回数据回存入输出缓冲区。
可以通过client list 来查看客户端信息,其中包括了一些缓冲区的容量信息。
客户端分类:
在Redis中客户端主要分为3中:
1、普通客户端:就是常规应用程序客户端,比如jedis、java程序连接的这种。
2、主从复制中slave:在主从复制模式中的从节点。
3、发布订阅模式频道的客户端。
输入缓冲区
Redis服务端对于每个redis客户端(以上3钟)输入缓冲区默认大小为1gb,redis不支持修改配置该大小,一般来说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,则将缓冲区中剩余数据发送给从(增量同步),否则进行全量同步。
原图下载: