redis控制抢红包金额

redis控制抢红包金额

红包规则:总金额是10元,每次随机0.1元-0.5元,金额发送超过5元,后面每次随机0.01元-0.02元。

疑问:如果并发起来,计算金额发送超过5元会导致有部分人拿到0.5元?

请问这里需要怎么控制这种并发呢?

方案1:入队列进行计算(这种方案不可行 因为需及时返回金额结果)
方案2:使用brpop进行阻塞 是否可行?

麻烦帮忙看看方案2是否可行?如不行 是否有别的方案处理呢?

阅读 2.2k
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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题