lua脚本使用

public class CashPartyRedisUtil extends ObjectRedisUtil {

    public static String CASH_PARTY_TOTAL_TICKET_NUM = "party:ticket:total:";

    public static String CASH_PARTY_SELL_TICKET_NUM = "party:ticket:sell:";

    public static String CASH_PARTY_SIGNUP_NUM = "party:signUp:";

    /**
     * 退票锁
     */
    public static String CASH_PARTY_CANCEL_LOOK = "cashPartyCancelLook";


    /**
     * 锁定派对门票
     *
     * @param cashPartyId
     * @param ticketType
     * @param ticketNum
     */
    public static int lockPartyTicket(String cashPartyId, Integer ticketType, Integer ticketNum, Integer totalNum) {
        StringBuffer sb = new StringBuffer();
        sb.append("local totalNum = tonumber(ARGV[2]);")
		
                .append("local sellNum= redis.call('get',KEYS[2]);")
				
                .append("sellNum = tonumber(sellNum);")
				
                .append("if sellNum then else sellNum=0;end;")
				
				
                .append("if sellNum+tonumber(ARGV[1]) > totalNum then return -1;end;")
				
                .append("redis.call('incrby',KEYS[2],ARGV[1]);")
				
                .append("redis.call('incrby',KEYS[3],ARGV[1]);")
				
                .append("return redis.call('get',KEYS[3]);");
        Object o = executeLua(
			sb.toString(), 
			new String[]{
				CASH_PARTY_TOTAL_TICKET_NUM + cashPartyId + ":" + ticketType,
                CASH_PARTY_SELL_TICKET_NUM + cashPartyId + ":" + ticketType,
                CASH_PARTY_SIGNUP_NUM + cashPartyId
			},
            new Object[]{
				ticketNum, 
				totalNum
			});
        int i = Integer.valueOf(o.toString());
        if (i == -1) {
            throw BusinessException.newParamsException("剩余票数不足");
        }
        return i;
    }

    /**
     * 释放派对门票
     *
     * @param cashPartyId
     * @param ticketNum
     */
    public static int unlockPartyTicket(String cashPartyId, Integer ticketType, Integer ticketNum) {
        StringBuffer sb = new StringBuffer();
        sb.append("redis.call('incrby',KEYS[1],-ARGV[1]);redis.call('incrby',KEYS[2],-ARGV[1]);return redis.call('get',KEYS[2]);");
        Object o = executeLua(
			sb.toString(), 
			new String[]{
				CASH_PARTY_SELL_TICKET_NUM + cashPartyId + ":" + ticketType,
				CASH_PARTY_SIGNUP_NUM + cashPartyId
			},
            new Object[]{ticketNum});
        return Integer.valueOf(o.toString());
    }

    /**
     * 获取剩余票数
     *
     * @param cashPartyId
     * @return
     */
    public static Integer getSurplusPartyTicket(String cashPartyId, Integer ticketType, Integer totalNum) {
        StringBuffer sb = new StringBuffer();
        sb.append("local totalNum = tonumber(ARGV[1]);")
                .append("local sellNum = redis.call('get',KEYS[2]);")
                .append("if sellNum then sellNum = tonumber(sellNum); else sellNum=0; end;")
                .append("return totalNum-sellNum; ");
        Object o = executeLua(
				sb.toString(), 
				new String[]{
					CASH_PARTY_TOTAL_TICKET_NUM + cashPartyId + ":" + ticketType,
					CASH_PARTY_SELL_TICKET_NUM + cashPartyId + ":" + ticketType}, 
				new Object[]{totalNum});
        int i = Integer.valueOf(o.toString());
        return i;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值