从 CLIENT LIST 的 qbuf/omem 等字段看 Redis 的每连接缓冲:空闲连接 tot-mem 2304 字节;不读取的客户端每个 1 MB 的 GET 回复让 omem 增加约 1 MB(100 个 → 105 MB);声明 50 MB 的 bulk 只发 10 MB 就让连接占用 52 MB(服务器按声明大小预留了 qbuf-free 42 MB);200 个空闲连接的 mem_clients_normal 平均约 8.5 KB/个。
实测 client-output-buffer-limit(normal 设为 10mb 5mb 3):不读取的客户端发到第 10 个 1 MB 回复时触发硬限制被断开;缓冲在 5–10 MB 之间的客户端持续约 3.1 秒(软限制 3 秒)后被断开;读得慢但未超限的客户端不受影响;normal 类默认不限制。
验证 Redis 的连接限制:默认 maxclients 10000;设成 100 后第 100 个连接起收到「ERR max number of clients reached」(21 个被拒,rejected_connections = 21),此时连 INFO 都连不上;timeout 2 的空闲连接约 2.7 秒后被关闭;1000 个空闲连接每个约 17 KB、占 1 个文件描述符。
构造 hot:1 占 30%、hot:2 占 10% 的 50 万次 GET 负载:allkeys-lfu 下 OBJECT FREQ 是 194 / 105 / 普通 key 约 6;redis-cli --hotkeys 约 2.4 s 排出 hot:1、hot:2;非 LFU 策略下 --hotkeys 与 OBJECT FREQ 报错;按 CRC16 计算 3 个分片的请求占比为 20% / 50% / 30%(热 key 分片承担一半)。
在有 5 个大 key(5 MB 字符串、20 万元素 list、10 万字段 hash、15 万成员 set、5 万成员 zset)和 30 万个小 key 的实例上手写大 key 扫描:SCAN COUNT 1000 + 管道 MEMORY USAGE,300006 个 key 用 0.72 s、PING 最大停顿 2.4 ms,5 个大 key 全部找出;MEMORY USAGE 每次约 0.1 ms;按字节与按元素数排序的结果不同。
在有 5 个大 key 的实例上运行 redis-cli --bigkeys 与 --memkeys(-i 0.01,各约 7 s):--bigkeys 按元素个数报告(list 20 万 items、set 15 万 members……),--memkeys 按 MEMORY USAGE 字节数报告(set 6784700 字节最大);两种口径下的排序不同;两者都只报告每种类型最大的一个 key。
验证 SCAN 的行为:游标不是递增序号;100 万个 key 时 COUNT 10/100/1000/10000 单次 0.038/0.105/0.78/7.1 ms,遍历期间 PING 最大停顿 1.1/12.6 ms,而 KEYS * 让 PING 停顿 95 ms;遍历中新增 40 万个 key,开始前的 20 万个 key 全部被遍历到;MATCH 在取出一批之后过滤,500 次调用里 498 次返回空数组。
实测 KEYS 的风险:另一个连接 PING 的最大停顿随 key 数线性增长——10 万个 31 ms、100 万个 123 ms、300 万个 424 ms;几乎无匹配的 KEYS 同样要遍历全部 key(300 万个时停顿 185 ms);SCAN COUNT 1000 遍历同样多 key 只造成 1.89 ms 停顿;可用 ACL 禁掉 KEYS。
用 redis-benchmark 量出四个常见陷阱:同一配置 5 次波动 ±12%;默认只打同一个 key(DBSIZE = 1、内存 1.0 MB,-r 才有数据);value 3 → 100 KB 吞吐 124k → 35k;连接数与管道让同一个 Redis 的数字差 23 倍(42k → 968k)。
用带 Zipf 热点的 80/15/5 读写混合负载,在 10 秒测试里注入 3 次 300 ms 的服务器阻塞:闭环压测测得 p99 0.04 ms、超过 100 ms 的请求 3 个;开环(每秒 5000)从「本应发送」时刻算,同样的服务器 p99 293 ms、4161 个请求超过 100 ms——测量方式决定了结论(协调遗漏)。
在本机实例上把 ACL 用户从头做一遍:default 用户出厂就是免密全权限;新用户默认什么都不能做;密码存 SHA-256;off 不踢老连接、DELUSER 会踢;改权限对已登录连接立即生效;不配 aclfile,重启后用户全没。
ACL Category 实测:8.10.2 共 449 条命令、22 个类别(@dangerous 88 条);ro / nodanger / appuser 三种常见配置对 19 条命令的逐条判定表;规则顺序会改变结果;子命令和选择器的粒度。