redis控制抢红包金额
redis控制抢红包金额
红包规则:总金额是10元,每次随机0.1元-0.5元,金额发送超过5元,后面每次随机0.01元-0.02元。
疑问:如果并发起来,计算金额发送超过5元会导致有部分人拿到0.5元?
请问这里需要怎么控制这种并发呢?
方案1:入队列进行计算(这种方案不可行 因为需及时返回金额结果)
方案2:使用brpop进行阻塞 是否可行?
麻烦帮忙看看方案2是否可行?如不行 是否有别的方案处理呢?
回答:
把每个红包的金额预先计算好,然后排队按顺序拿
回答:
可以使用 Redis 的 lua 脚本来做这件事情,伪代码
大概如下
// 设置已经领取的金额为 0 ,如果已存在则不设置setnx rd_count_1 0
// 获取锁,如果失败就直接返回
if not (setnx rd_count_1_lock)
return -1
// 可以设置一个自动释放锁的时间,这个需要根据自己的业务来确定
expire rd_count_1_lock 100
// 获取 Redis 中已经领取的金额来判断,然后计算本次的金额
if (get rd_count_1) < 5
amount = rand(0.1, 0.5)
else
amount = rand(0.1, 0.2)
// 最后把本次的金额加到已经领取的金额上去
result = (incr rd_count_1 amount)
// 删除锁
del rd_count_1_lock
// 返回结果
return (amount, result)
以上是 redis控制抢红包金额 的全部内容, 来源链接: utcz.com/p/938141.html