数据交互场景中,缓冲区的存在起到了至关重要的作用,比如
在Redis中,也存在缓冲区,即使Redis本身就是将数据存储在内存中,但也利用了内存缓冲区来避免因为请求处理速度跟不上请求接收速度而导致的数据丢失和性能问题。
Redis是C/S架构,所有的操作命令都会通过客户端然后发往服务端。
需要注意的是,Redis会给每个连接的客户端都设置一个输入缓冲区和输出缓冲区,如下图所示:
Redis的主从复制可以分为全量复制和增量复制。两种复制都会利用到缓冲区来暂存数据。
缓冲区的大小总是有上限的,当其中的数据积压太多就会发生缓冲区溢出的情况。
下面来说下Redis几种缓冲区发生溢出的原因和解决方法
溢出后果
maxmemory
阈值时会触发redis数据淘汰,当redis作为数据库前端缓存使用时会降低业务访问性能原因
查看输入缓冲区内存使用情况
1127.0.0.1:6379> client list2id=3 addr=127.0.0.1:45848 fd=8 name= age=2 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
qbuf + qbuf-free = 32768 bytes=32KB
, 即这个连接分配得到的缓冲区大小为32KB。
避免
溢出后果
输出缓冲区溢出,则对应的客户端连接会被Redis关闭,导致业务受影响
原因
避免
输出缓冲区大小设置
redis的客户端,除了主从架构中的从节点客户端(作用于和从节点进行数据同步)外,主要使用两类:
以上两种客户端的输出缓冲区大小可以通过如下参数进行设置:
client-output-buffer-limit normal 0 0 0 # normal表示针对普通客户端,后续3个0依次表示缓冲区大小限制,缓冲区持续写入量限制,缓冲区持续写入时间限制,0表示不作限制,为建议值
2client-output-buffer-limit pubsub 8mb 2mb 60 # pubsub表示针对订阅客户端,8mb表示输出缓冲区大小上限,2mb和60表示:如果连续 60 秒内对输出缓冲区的写入量超过 2MB 的话,服务器端也会关闭客户端连接
溢出后果
主节点会直接关闭和从节点进行复制操作的连接,导致全量复制失败
原因
避免
client-output-buffer-limit slave 512mb 128mb 60 # 521mb表示针对复制缓冲区大小上限,128mb和60表示:如果连续60s内的写入量超过128mb也会触发复制缓冲区溢出注意点
注意点:
maxmemory
,也就不会是内存达到上限触发数据淘汰策略的影响因素溢出后果
复制积压缓冲区发生溢出即新的命令会覆盖旧的命令,如果从节点还没有同步这些旧的数据,则会造成主从重新执行全量复制
原因
避免
repl_backlog_size
估算方法:second * write_size_per_second
repl_backlog_size可设为2倍于此估算值的大小
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。