抽奖算法

根据每个物品的库存,库存数量与中奖概率成反比。

因此可以载入所有物品的库存。然后归一化。

生成一个随机数,看落到哪个区间,对应的就是哪个商品。

中奖后的库存处理

物品被抽中,对应库存要-1,但是并发流量大,如果频繁修改数据库没法支持。

可以把库存完全由 Redis 来控制。

载入库存

初始化时,后台可以使用生产者、消费者模式,把所有物品库存载入 Redis

获取库存

从 Redis 中取出

更新库存

使用 Redis 的 Decre 操作,可以保证原子性。

接收如果减完Redis 的返回值,如果小于 0 说明有人更先拿到了。本次应该无效。

无效后怎么兜底呢?

  • 一方面可以在代码层面尝试循环几次(多抽两次)
  • 如果抽多次还不行(小概率),用业务逻辑兜底(直接给你个谢谢参与我谢谢你啊)