抢红包逻辑及核心代码:
- 先判断用户有没有抢过红包,如果没有则进行第二步
- 判断红包个数,如果>0 则直接返回数量
- 判断红包金额,如果>0则直接返回金额
核心代码
说明:这里特别需要说明的,redis的相关操作,全部用的lua脚本,这么做完全是为了提高性能以及降低代码的复杂度。
这需要开发者对lua脚本有一定的理解,如果对lua不懂的,可以简单学习一下,本人也是做此功能的时候现学的。
/**
* 抢红包的逻辑
* 1.先判断用户有没有抢过红包,如果抢过了直接返回
* 1.1判断红包个数,如果>0 则直接返回数量
* 1.2判断红包金额,如果>0 则直接返回金额
*
* @param redPacketId
* @param uid
* @return
*/
public Map getRedPacket(long redPacketId,int uid){
//验证是否获取过红包的key
String CHECK_IS_GET = redPacketId + TOTAL_NUM + "_" + uid;
//验证红包总数
String CHECK_TOTAL_NUM = redPacketId + TOTAL_NUM;
//验证红包金额
String CHECK_TOTAL_AMOUNT = redPacketId + TOTAL_AMOUNT;
String status = redisService.getStatus(LUA_CHECK, CHECK_IS_GET, CHECK_TOTAL_NUM, CHECK_TOTAL_AMOUNT);
if(status != null){
return this.checktUseAuthority(status);
}
return Collections.emptyMap();
}
lua脚本
local localExistKey = KEYS[1]
local localTotalKey = KEYS[2]
local localAmountKey = KEYS[3]
local existKey = "exist:1"
local totalKey = "total:"
local amountKey = "amount:"
local result_1 = redis.call("GET",localExistKey)
if result_1
then
return existKey
else
local result_2 = redis.call("GET",localTotalKey)
local result_3 = redis.call("GET",localAmountKey)
if result_2 == nil
then
return totalKey
else
return totalKey..result_2
end
if result_3 == nil
then
return amountKey
else
return result_3..amountKey
end
end