知其然,知其所以然
Redis 2026-09-29

Pending Entries List

在本机 Redis 上验证 Stream 的 Pending Entries List:消息投递就进 PEL(记录消费者、idle、投递次数),XPENDING 汇总与明细的格式,重读历史会让投递次数 +1,NOACK 不进 PEL,PEL 只存 ID 不存内容(XDEL 后仍在),10 万条不 ack 会让内存增加约 94 字节/条。

Redis Stream PEL 真实验证 动画演示
Redis 2026-09-29

XACK 和消息确认

在本机 Redis 上验证 XACK:它只把 ID 从组的 PEL 里移除,返回真实移除的条数(重复 ack、不存在的 ID 都返回 0),不会删除流里的消息(XLEN 不变);PEL 按组维护;并实测 Redis 8.x 新增的 XACKDEL 的 ACKED / KEEPREF / DELREF 三种策略对别的组 PEL 的影响。

Redis Stream XACK 真实验证 动画演示
Redis 2026-09-29

消费者崩溃后的消息转移

用独立进程真实 kill -9 一个 Stream 消费者:连接断开后它的 PEL 仍留在组里、idle 持续增长、消息不会自动转给别的消费者;另一个消费者要用 XCLAIM 主动认领(投递次数 +1,min-idle 防重复认领);XGROUP DELCONSUMER 会直接丢弃 PEL,是个危险操作。

Redis Stream 故障恢复 真实验证 动画演示
Redis 2026-09-29

XAUTOCLAIM

在本机 Redis 上验证 XAUTOCLAIM:用游标翻页认领超时未 ack 的消息(10 条 pending、COUNT 3 共 4 次调用,游标回到 0-0 表示结束),认领后 idle 归零且投递次数 +1,JUSTID 不增加投递次数,PEL 中已被 XDEL 的消息会被清掉并在返回值第三项列出。

Redis Stream XAUTOCLAIM 真实验证 动画演示
Redis 2026-09-29

Stream 消息回收

10 万条消息的 Stream 内存回收实测:XACK 全部确认后内存回到 11.20 MB(只回收 PEL,XLEN 不变);XDEL 隔一条删一条内存不变(11.20 MB),连续删前一半才降到 5.60 MB;XTRIM MINID 效果与连续删除相同,XTRIM MAXLEN 0 清空后内存只剩 260 字节。

Redis Stream 内存 真实验证 动画演示
Redis 2026-09-29

MAXLEN ~ 近似裁剪

实测 Stream 的 MAXLEN ~(近似裁剪):逐条 XADD 时精确裁剪 XLEN 恒为 1000,近似裁剪在 1000–1099 之间锯齿(一次掉一个 100 条的节点);稳态下每条 XADD 耗时:不裁剪 1.90 µs、近似 2.76 µs、精确 5.44 µs;整节点裁剪很便宜(100 万条 0.0 ms),但 ~ 的默认 LIMIT 只删 1 万条。

Redis Stream XTRIM 真实验证 动画演示
Redis 2026-09-29

Stream 与 List 队列对比

用同一台本机 Redis 对比 Stream 与 List 做消息队列:10 万条 64 字节消息 List 73.5 B/条、Stream 81.7 B/条;管道入队 LPUSH 768k/s、XADD 510k/s;阻塞等待延迟量级相同(p50 约 0.2 ms);消费者崩溃时 List 的 5 条取出消息无处可查,Stream 在 PEL 里可认领;Stream 支持多消费组扇出与回看。

Redis Stream List 消息队列 真实验证 动画演示
Redis 2026-09-29

Pub/Sub 丢消息问题

在本机 Redis 上复现 Pub/Sub 丢消息的三种情形:没有订阅者时消息直接消失;订阅者掉线 0.5 秒,300 条里丢了连续的 35 条(101–135);订阅者读得慢超过 client-output-buffer-limit pubsub 会被服务器断开(发到第 746 条时);服务器重启后订阅关系不保留。

Redis Pub/Sub 可靠性 真实验证 动画演示
Redis 2026-09-29

Pub/Sub 与 Stream 对比

把 Pub/Sub 与 Stream 放在同一实例上对比:消费者离线期间的 100 条,Pub/Sub 上线后一条也收不到、Stream 消费组一次读回 100 条;发布 10 万条 Pub/Sub 几乎不占内存、Stream 占 11.4 MB;PUBLISH 耗时随订阅者数线性增长(N=5000 时 17.7 ms),XADD 不受消费者数量影响。

Redis Pub/Sub Stream 真实验证 动画演示
Redis 2026-09-29

Keyspace Notification

实测 Keyspace Notification:默认关闭;KEA 下一条命令产生 keyspace 与 keyevent 两条通知;expired 事件在空闲实例上比 TTL 晚 5.3 ms(中位),但池子里有 1000 个以上长 TTL key 时,30 个短 TTL key 的事件 20 秒内只到 22/30 以下(30 万个时 1/30);发后即忘;开启 KEA 使管道 SET 吞吐下降约 18%。

Redis Keyspace Notification 过期 真实验证 动画演示
Redis 2026-09-29

PSYNC2 复制协议

用 3 个本机 Redis 节点验证 PSYNC2:提升从库后它保留旧主的 replid 作为 replid2(second_repl_offset = 提升时 offset + 1);另一个从库改跟随新主、旧主降为从库重新加入,都是部分重同步(新主 sync_full 变化 0 / 0,partial_ok +1 / +1);毫无关系的新节点则只能全量同步。

Redis 复制 PSYNC2 真实验证 动画演示
Redis 2026-09-29

全量同步中的 RDB 传输

100 万个 key 的主库,磁盘方式全量同步的实测时间线:BGSAVE 0.57 s → 传输 24.9 MB RDB 不到 0.03 s → 从库加载 0.59 s,共 1.18 s;同步期间主库写入 391 个 key 被缓冲后补发(最大输出缓冲 20504 字节),最终两边 dbsize 都是 1000391。

Redis 复制 RDB 全量同步 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号