lua脚本防止红包超抢

 1 -- 抢红包脚本
 2 --[[
 3 --red:list 为 List 结构,存放预先生成的红包金额
 4 red:draw_count:u:openid 为 k-v 结构,用户领取红包计数器
 5 red:draw为 Hash 结构,存放红包领取记录
 6 red:task 也为 List 结构,红包异步发放队列
 7 openid 为用户的openid
 8 ]]--
 9 local openid = KEYS[1]
10 local isDraw = redis.call("HEXISTS","red:draw",openid)
11 
12 -- 已经领取
13 if isDraw ~= 0 then
14     return true
15 end
16 -- 领取太多次了
17 local times = redis.call("INCR","red:draw_count:u:"..openid)
18 if times and tonumber(times) > 9 then
19     return 0
20 end
21 
22 local number = redis.call("RPOP","red:list")
23 -- 没有红包
24 if not number then
25     return {}
26 end
27 -- 领取人昵称为Fhb,头像为 https:// xxxxxx
28 local red = {money=number,name=KEYS[2] , pic = KEYS[3] }
29 -- 领取记录
30 redis.call("HSET","red:draw",openid,cjson.encode(red))
31 
32 -- 处理队列
33 red["openid"] = openid
34 redis.call("RPUSH","red:task",cjson.encode(red))
35 
36 return true

 

posted @ 2022-03-07 11:21  塔扣  阅读(67)  评论(0)    收藏  举报