Redis--客户端输入、输出缓存区

一、输入缓冲区

1,简介:

Redis 为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命 令临时保存,同时Redis 从会输入缓冲区拉取命令并执行,输入缓冲区为客户端发送命令到Redis执行命令提供了缓冲功能,避免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但缓冲区的内存空间有限,如果发生溢出,就会丢失数据。
 

2、应用场景

Redis缓冲区有两个应用场景:

(1)在客户端和服务器端之间进行通信时,用来暂存客户端发送的命令数据,或者是服务器端返回给客户端的数据结果

2.主从节点间进行数据同步时,用来暂存主节点接收的写命令和数据。

 

3、会产生的问题

问题:

(1)一旦某个客户端的输入缓冲区超过1G,客户端将会被关闭。

(2)输入缓冲区不受maxmemory控制,假设一个Redis实例设置了 maxmemory为4G,已经存储了2G数据,但是如果此时输入缓冲区使用了 3G,已经超过maxmemory限制,可能会产生数据丢失、键值淘汰、OOM等情况

产生原因:

(1)每次进入输入缓冲区的命令包含了大量 bigkey,从而造成了输入缓冲区过大的情况

(2)Redis发生了阻塞,短期内不能处理命令造成客户端输入的命令积压在了输入缓冲区

如何避免:

(1)建立监控通过定期执行client list命令,收集qbufqbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端,

(2)通过定期执行client list命令,收集qbufqbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端

优劣对比

二、输出缓冲区:

1.简介

Redis 为每个客户端分配了输出缓冲区,它的作用是保存命令执行的结 果返回给客户端,为Redis和客户端交互返回结果提供缓冲,与输入缓冲区不同的是,输出缓冲区的容量可以通过参数client-output- buffer-limit来进行设置,并且输出缓冲区做得更加细致,按照客户端的不同 分为三种:普通客户端、发布订阅客户端、slave客户端

2.输出缓冲区分类

实际上输出缓冲区由两部分组成

1.固定缓冲区(16KB):返回比较小的执行结果,使用的是字节数组

2.动态缓冲区:返回比较大的结果,例如大的字符串、hgetall、smembers命令的结果等,动态缓冲区使用的是列表,当固定缓冲 区存满后会将Redis新的返回结果存放在动态缓冲区的队列中,队列中的每个对象就是每个返回结果

2.会产生的问题

和输入缓冲区相同的是,输出缓冲区也不会受到 maxmemory 的限制,如果使用不当同样会造成maxmemory 用满产生的数据丢失、键值淘汰、 OOM 等情况
解决方案和输入缓冲区也一致,
(1)通过定期执行client list命令,收集obl、oll、omem找到异常的连接记录并分析,最终找到可能出问题的客户端。
(2)通过info命令的info clients模块,找到输出缓冲区列表最大对象数
 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值