抽奖算法
根据每个物品的库存,库存数量与中奖概率成反比。
因此可以载入所有物品的库存。然后归一化。
生成一个随机数,看落到哪个区间,对应的就是哪个商品。
中奖后的库存处理
物品被抽中,对应库存要-1,但是并发流量大,如果频繁修改数据库没法支持。
可以把库存完全由 Redis 来控制。
载入库存
初始化时,后台可以使用生产者、消费者模式,把所有物品库存载入 Redis
获取库存
从 Redis 中取出
更新库存
使用 Redis 的 Decre 操作,可以保证原子性。
接收如果减完Redis 的返回值,如果小于 0 说明有人更先拿到了。本次应该无效。
无效后怎么兜底呢?
- 一方面可以在代码层面尝试循环几次(多抽两次)
- 如果抽多次还不行(小概率),用业务逻辑兜底(直接给你个谢谢参与我谢谢你啊)