结论:使用Redis的原子操作如DECR和Lua脚本实现库存扣减,结合Redis锁或乐观锁处理高并发;实时数据同步通过Pub/Sub或Stream机制广播库存变化;订票超时采用分布式锁+临时票缓存,超时自动释放;缓存优化策略包括热点数据预热、缓存穿透防护、布隆过滤器和多级缓存架构,确保99.99%高并发QPS。
方案一
在高并发订票场景下,Redis作为缓存层,使用SETNX实现分布式锁,确保同一张票不会被多人同时抢到。锁超时时间设置为30秒,结合watch多版本控制,防止锁过期后数据不一致。库存用Hash结构存储,原子DECRBY扣减,避免超卖。实时同步用Redis Pub/Sub,扣减成功后发布消息到channel,订阅者更新MySQL库存。
方案二
解决订票超时问题:用户下单后,将票据信息存入Redis临时key,设置TTL为5分钟。生成临时订单号,用Redis锁锁定该票。超时未支付时,自动过期释放库存。同时用Lua脚本原子执行:检查库存-扣减库存-生成锁-设置临时票,防止并发。
方案三
缓存优化:预热热门演唱会票务数据到Redis,避免冷启动。使用pipeline批量操作减少RTT。缓存雪崩防护:随机TTL + 热点key互斥锁。穿透用布隆过滤器判断库存是否存在。读写分离,主从复制同步数据,哨兵高可用。
方案四
高并发处理:Redis Cluster分片存储票务数据,按场次ID hash分片。限流用Redis令牌桶算法,每秒QPS控制在10万内。实时同步:用Redis Stream记录库存变更日志,消费者组并行消费更新下游DB和ES搜索。
方案五
超时处理细节:下单时生成seat:lock:{userId}:{ticketId} key,value为过期时间戳,用EXPIRE设置TTL。支付回调成功则DEL锁并扣库存,失败或超时自动释放。Lua脚本确保原子性:if (库存>0 and 锁不存在) then 扣库存+set锁 else 失败。
方案六
优化策略:缓存淘汰用LRU,内存利用率达90%。热点数据用本地Caffeine二级缓存,Redis做三级。数据一致性: Canal监听MySQL binlog,异步写Redis。监控用Redis INFO和SLOWLOG。
FAQ
Q: 高并发下怎么防止超卖?
A: 用Redis的DECR原子操作结合Lua脚本单次执行扣减。
Q: 订票超时多久合适?
A: 一般5-10分钟,根据业务调整,TTL自动释放。
Q: 实时同步怎么保证不丢消息?
A: Redis Stream的消费者组+ACK机制,重试丢失消息。
Q: 缓存穿透怎么防?
A: 布隆过滤器+空值缓存,TTL短。