问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

并发抢红包解决方案:拆包算法、预分配与高效数据存储架构

创作时间:
作者:
@小白创作中心

并发抢红包解决方案:拆包算法、预分配与高效数据存储架构

引用
CSDN
1.
https://blog.csdn.net/shall_zhao/article/details/138324154

在高并发场景下,如何设计一个既公平又高效的红包领取系统?本文将从拆包算法、预分配方案、数据存储架构等多个维度,深入探讨并发抢红包的技术解决方案。


二倍均值法拆包

抢红包——拆包算法——要解决并发问题

在高并发场景下,加锁虽然能保证数据一致性,但会严重影响系统性能。因此,需要寻找一种既能保证公平性,又能支持高并发的技术方案。

预分配红包

预分配方案是一种常见的解决方案。具体实现方式是在用户支付完成后,在后台预先计算好每个红包的具体金额,并将这些金额暂存起来。当用户抢红包时,系统可以直接从预存的列表中取出红包,避免了实时计算的开销。

预分配实现细节

  • 使用Redis List存储红包金额:发红包时,将计算好的金额存入Redis的List结构中。每次抢红包时,从List中取出一个红包。
  • 使用Redis Hash记录领取记录:同时使用Hash结构记录谁抢到了哪个红包,便于后续查询红包领取记录。

但是,这种方案在面对日均百亿级的并发请求时,仍然存在性能瓶颈。

Redis集群解决方案

单个Redis实例的并发处理能力有限,通常只能支持几万级的并发。为了解决这一问题,可以采用Redis集群架构。但是,集群架构也带来了新的挑战,例如节点故障时的数据一致性问题。

实时拆包与CAS机制

微信红包系统可能采用的是实时拆包方案,通过CAS(Compare and Swap)操作来解决并发问题。CAS操作具有以下特点:

  • 版本号控制:在第一次发红包时记录版本号,后续操作通过比较版本号来判断是否需要更新。
  • 失败处理:CAS操作可能会失败,为了避免CPU过度消耗,可以在失败时进行短暂休眠。
  • 效率优势:CAS操作在内存中执行,效率很高。

微信自研了支持CAS操作的ckV缓存框架,该框架类似于Redis但支持CAS操作,且不开源。在实际应用中,可以使用Lua脚本实现CAS操作,因为Lua脚本在Redis中是单线程执行的,可以保证原子性。

多级缓存架构

为了降低Redis的压力,可以采用多级缓存架构。例如,使用Ehcache作为第一级缓存,设置较短的过期时间,当数据过期时从Redis中获取最新的数据。

异地多活架构

在多机房部署场景下,为了保证系统的高可用性和公平性,可以采用异地多活架构。例如,用户在上海抢深圳发放的红包时,可以通过专线直接路由到深圳的红包系统,最大限度地保证公平性。

柔性降级方案

为了应对系统故障,可以设计柔性降级方案。例如,使用消息队列(MQ)将数据异步写入数据库,当Redis出现故障时,可以从数据库中读取数据,保证系统的可用性。

海量数据存储架构

考虑到Redis的数据存储能力有限,通常只保留最近一天的数据。对于海量的红包数据,需要设计合理的数据库存储架构。例如,可以采用分库分表策略,将数据分散存储在多个数据库实例中,避免单表数据量过大导致的性能瓶颈。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号