使用Redis构建高性能撮合交易系统,首先采用Redis的Sorted Set作为订单簿的核心数据结构,以price作为score,order_id作为member,实现限价订单的快速插入和匹配。买单和卖单分别维护独立的ZSet,撮合时通过ZSCORE和ZRANGEBYSCORE快速定位最佳价格,进行价格优先、时间优先的匹配逻辑。交易核心通过Redis Pipeline批量执行多条命令,减少RTT延迟;使用Lua脚本原子执行撮合逻辑,避免并发冲突;持久化采用AOF+RDB混合,确保数据安全;集群模式下分片订单簿,按交易对hash到不同节点,实现水平扩展。高可用通过Redis Sentinel或Cluster实现自动 failover,结合业务侧MQ异步补偿,确保稳定高效。
订单簿设计
Redis Sorted Set是撮合引擎的核心。买单ZSet(score=-price, member=order_id),卖单ZSet(score=price, member=order_id)。挂单时ZADD插入,查询买一/卖一用ZRANGE 0 0,撮合时ZRANGEBYSCORE遍历匹配。取消订单用ZREM,部分成交用ZINCRBY调整数量(额外维护quantity Hash)。
撮合逻辑Lua脚本
local buy_zset = KEYS[1] local sell_zset = KEYS[2] local buy_order = ARGV[1] local sell_order = ARGV[2] local buy_price = tonumber(ARGV[3]) local sell_price = tonumber(ARGV[4]) local buy_qty = tonumber(ARGV[5]) local sell_qty = tonumber(ARGV[6]) -- 撮合循环 while buy_qty > 0 and sell_qty > 0 do local match_price = math.min(buy_price, sell_price) local match_qty = math.min(buy_qty, sell_qty) -- 更新成交记录 HINCRBY("trades", match_price, match_qty) -- 剩余数量 if buy_qty > match_qty then ZINCRBY(buy_zset, -match_qty, buy_order) else ZREM(buy_zset, buy_order) end -- 类似处理卖单 buy_qty = buy_qty - match_qty sell_qty = sell_qty - match_qty end return {buy_qty, sell_qty}
高并发优化
1. Pipeline批量提交挂单/撤单命令;2. 读写分离,主节点写,从节点读深度行情;3. 业务预校验,减少无效Redis调用;4. 热点交易对多副本部署;5. 结合RocksDB做混合存储,大单拆分持久化。
稳定性保障
Redis Cluster分片+Sentinel高可用;AOF每秒fsync,RDB 5分钟快照;业务侧订单状态机+MQ幂等确认;限流熔断QPS 10w+;监控告警延迟、命中率、集群状态。
性能测试数据
单机QPS 50w+,延迟P99 1ms;集群16节点扩展至500w QPS;对比内存撮合引擎,Redis方案成本降低70%,易运维。
FAQ
Q: Redis单线程怎么支撑高并发?
A: 单线程无锁竞争,Pipeline+多路复用IO支撑百万QPS,业务拆分多实例即可。
Q: 订单持久化怎么保证不丢单?
A: AOF+RDB双保险,业务异步落盘+MQ重试,异常时支持回滚重放。
Q: 集群环境下订单路由怎么做?
A: 按交易对CRC16 hash分片,客户端一致性hash,新增节点自动rebalance。
Q: 深度行情怎么高效推送?
A: Redis Pub/Sub或Stream,增量快照+delta更新,WebSocket推送给客户端。