21 | 缓冲区:一个可能引发“惨案”的地方

极客时间 | 《Redis核心技术与实战》学习笔记目录

原文

缓冲区是用来避免请求或数据丢失的惨案的,但也只有用对了,才能真正起到“避免”的作用

  • 暂存客户端发送的命令数
  • 暂存服务器端返回给客户端的数据结果
  • 在主从节点间进行数据同步时,用来暂存主节点接收的写命令和数据

客户端输入和输出缓冲区

为了避免客户端和服务器端的请求发送和处理速度不匹配,服务器端给每个连接的客户端都设置了一个输入缓冲区和输出缓冲区,我们称之为客户端输入缓冲区和输出缓冲区。

如何应对输入缓冲区溢出?

可能导致溢出的两种情况

  • 写入了 bigkey,比如一下子写入了多个百万级别的集合类型数据
  • 服务器端处理请求的速度过慢,例如,Redis 主线程出现了间歇性阻塞,无法及时处理正常发送的请求,导致客户端发送的请求在缓冲区越积越多

要查看和服务器端相连的每个客户端对输入缓冲区的使用情况,我们可以使用 CLIENT LIST 命令

从两方面考虑避免输入缓冲区溢出

  • 把缓冲区调大
    • Redis 服务器端允许为每个客户端最多暂存 1GB 的命令和数据
  • 从数据命令的发送和处理速度入手

如何应对输出缓冲区溢出?

Redis 为每个客户端设置的输出缓冲区包括两部分

  • 一个大小为 16KB 的固定缓冲空间,用来暂存 OK 响应和出错信息
  • 一个可以动态增加的缓冲空间,用来暂存大小可变的响应结果

什么情况下会发生输出缓冲区溢出呢?

  • 服务器端返回 bigkey 的大量结果
  • 执行了 MONITOR 命令
    • MONITOR 命令主要用在调试环境中,不要在线上生产环境中持续使用 MONITOR
  • 缓冲区大小设置得不合理

主从集群中的缓冲区

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus