Redis应用项目---抢红包功能(三)

抢红包逻辑及核心代码:

  1. 先判断用户有没有抢过红包,如果没有则进行第二步
  2. 判断红包个数,如果>0 则直接返回数量
  3. 判断红包金额,如果>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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值