bigywater.tech
Redis · 113

Redis 客户端输出缓冲区

上一篇看到输出缓冲可以无限涨。client-output-buffer-limit 就是给它加的保险:硬限制一超立刻断开,软限制超过并持续一段时间也断开。这篇把两种限制各触发一次,量断开发生的确切位置与时间。

第 10 个
硬限制 10 MB:不读取的客户端发到第几个 1 MB 回复时被断开
3.1 秒
软限制 5 MB / 3 秒:输出缓冲在 5–10 MB 之间的客户端被断开所用的时间
normal 默认 0 0 0
普通客户端默认没有输出缓冲上限

配置格式

实测 · 本机执行输出
  normal 10485760 5242880 3 slave 268435456 67108864 60 pubsub 33554432 8388608 60

client-output-buffer-limit 类别 硬限制 软限制 软限制秒数。normal 是普通客户端(默认 0 0 0,不限制),replica 是从库(默认 256mb 64mb 60),pubsub 是订阅者(默认 32mb 8mb 60)。

硬限制

实测 · 本机执行输出
  发送到第 10 个 GET 时被服务器断开(client_output_buffer_limit_disconnections 0 → 1)
  日志: Client id=6 addr=127.0.0.1:56877 laddr=127.0.0.1:8220 fd=10 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 watch=0 qbuf=23 qbuf-free=20451 argv-mem=7 multi-mem=0 rbs=16384 rbp=16384 obl=

一个不读取的客户端连续发 GET,每个回复 1 MB。发到第 10 个(累计约 10 MB)时被服务器断开,INFO stats 的 client_output_buffer_limit_disconnections 从 0 变 1,日志里记录了被关闭的客户端详情(scheduled to be closed ASAP for overcoming of output buffer limits)。

软限制

实测 · 本机执行输出
  发 7 个 GET(约 7 MB,在 5 MB 与 10 MB 之间):约 3.1 秒后被断开(disconnections 1 → 2)

缓冲在 5 MB(软限)到 10 MB(硬限)之间:发 7 个 GET 不会立刻断开,持续约 3.1 秒(配置的 3 秒)后被断开。用来容忍「短暂的突发」而不误杀。

读得慢但没超限

实测 · 本机执行输出
  每 0.2 秒读一点之后的 omem(字节): [2097152, 2097152, 2097152, 2097152, 2097152, 2097152]

发 3 个 GET、每 0.2 秒只读一点:服务器上 omem 一直是 2097152 字节(约 2 MB,低于软限),没有被断开。慢客户端只要不超限就不受影响。(这一节数据不多,只说明「没超限不会断」。)

分步演示:两种限制

Redis 客户端输出缓冲区
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。不读取的客户端是接收缓冲 4 KB 的原始 socket;normal 类被临时设为 10mb 5mb 3 便于演示,默认值是 0 0 0
    • 没有验证:replica 类限制被触发时对复制的影响(第 58 篇提到过)、pubsub 类(第 49 篇已触发过)、软限制计时的精度、多个客户端同时超限时的顺序
    京ICP备2026067502号-1京公网安备11010502063487号