redis pub/sub 不适合金融交易,因其无消息持久化、无历史回溯、无确认机制,断连即丢消息,且集群下不保证顺序;应改用 redis stream 或 kafka。

Redis Pub/Sub 无法回溯已发布但未消费的消息,因此完全不适合金融交易类高价值数据流。
为什么 SUBSCRIBE 后收不到断连期间的消息
Redis 不保存历史消息,SUBSCRIBE 是纯“当前在线即收”的广播行为。客户端一旦断开(哪怕只是网络抖动、GC 暂停或进程重启),中间所有 PUBLISH 都直接丢弃,且无任何机制补发。
-
redis-cli手动SUBSCRIBE trade:1001后 Ctrl+C,再重连执行同样命令 → 收不到断连那几秒的成交事件 - Java 应用用 Lettuce 订阅,JVM Full GC 导致连接空闲超时被服务端踢掉 → 断连窗口内的订单状态变更全部丢失
- 没有类似 Kafka 的
offset或 Redis Stream 的ID概念,无法指定“从某条消息开始重读”
为什么 PUBLISH 返回值不能当作投递成功依据
PUBLISH 命令返回的是当前在线订阅者数量(例如 (integer) 2),它只反映“此刻谁在听”,不表示消息是否被处理、是否被 ACK、是否落地到业务逻辑。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 返回
0≠ 消息失败:可能是订阅者刚上线还没完成SUBSCRIBE流程,也可能是网络延迟导致subscribe命令还没抵达服务端 - 返回
3≠ 消息安全:三个客户端可能其中两个正在反序列化失败、一个写 DB 时抛了异常,但PUBLISH早已返回 - 无法与下游操作形成因果链,比如你无法知道 “
PUBLISH trade:1001 {...}成功” 是否意味着风控模块已同步更新了限额
集群环境下连“单频道内顺序”都无法保证
在 redis-cluster 中,不同 channel 可能落在不同 master 节点上;即使同一 channel,因哈希槽迁移或重分片,消息实际路由路径不可控。
- 客户端 A 向
channel:order发送两条消息:{"id":"101","status":"created"}和{"id":"101","status":"filled"} - 这两条消息可能被路由到不同节点,再推送给订阅者时出现乱序,导致风控看到 “filled” 却没看到 “created”
- 更关键的是:
PUBLISH不参与MULTI/EXEC事务,也无法用WATCH监控 channel 状态 —— 你没法把 “扣款 + 发布” 绑定为原子操作
真正要支撑金融级事件流,必须放弃 PUBSUB,改用 XADD/XREAD 构建的 Stream:它支持消费者组、XPENDING 查未确认消息、XACK 显式确认、按 ID 回溯。但即便如此,Stream 仍不提供跨 Stream 事务,也不等价于 Kafka 的 ISR 副本仲裁 —— 这些边界得在架构设计初期就划清楚。










