12 lines
1.4 KiB
Markdown
12 lines
1.4 KiB
Markdown
1.根据用户类型确定使用哪个奖池,普通奖池,补偿奖池,三级爆率奖池,
|
||
在再根据宝箱id和用户类型获取锁,防止同一个宝箱同一个用户类型的并发抽奖,持续10秒,重试三次
|
||
2.获取三个奖池对象,判断三个奖池是否为空,如果为空,就初始化创建空奖池
|
||
3.查询用户是否拥有三级爆率,如果不为空,说明有三级爆率
|
||
4.根据是否有三级爆率权限,选择使用哪个奖池,checkPool() 方法首先查看当前prizePool对象是否有数据,
|
||
是直接返回,否则去redis中查看是否有数据,有则将数据加入prizePool对象中,
|
||
否则去数据库中查询,并加入prizePool对象中,有三级爆率就使用thirdExplosivePrizePool,否则使用prizePool
|
||
5.补偿机制,先查询用户的补偿记录是否有值,如果是补偿箱并且没有补偿记录,创建空的补偿记录,如果有补偿记录,查看是否到达补偿阈值,
|
||
如果是补偿箱并且补偿值>=阈值,将切换到补偿奖池,并将补偿值清楚,将补偿记录删除
|
||
6.执行抽奖的算法doLottery()方法,箱子里面包含饰品及其数量,获取饰品总数量,并且随机五次并记录最后一次的值,
|
||
然后循环每个饰品的位置,如果这个位置的值和记录的最后一次的值相同,拿到当前饰品的id,
|
||
如果循环多次没有拿到,就取饰品的第一个(按序给),库存减一 |