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;
}
}
lua脚本使用
最新推荐文章于 2025-03-02 22:34:04 发布