Redis执行Lua脚本示例(RedisScript)

 脚本案例

/**
 * KEYS[1]  单个用户中奖总数
 * KEYS[2]  奖品项 每日中奖数
 * KEYS[3]  奖品项 总数量
 * <p>
 * ARGV[1]  单个用户中奖总数 最大值
 * ARGV[2]  奖品项 每日中奖数 每日中奖数
 * ARGV[3]  奖品项 最大值
 * <p>
 * ARGV[4]  剩余 TTL时间
 */
private final static DefaultRedisScript<List> JudgeHitTimesScript = new DefaultRedisScript<>(
        "local result={}" +
                "local userMaxTimes  = tonumber(ARGV[1]);" +
                "local packageOrderDayTimes = tonumber(ARGV[2]);" +
                "local packageOrderMaxTimes = tonumber(ARGV[3]);" +

                "local userAmount = redis.call('INCR',KEYS[1]); " +
                "if userMaxTimes >0 and userAmount > userMaxTimes then  redis.call('DECR', KEYS[1]) result[1] = -102;  return result end;" +

                "local packageOrderDayAmount = redis.call('INCR',KEYS[2]); " +
                "if packageOrderDayTimes > 0 and packageOrderDayAmount > packageOrderDayTimes then  redis.call('DECR', KEYS[1]) ; redis.call('DECR', KEYS[2]); result[1] = -103;  return result end;" +

                "local packageOrderAmount = redis.call('INCR',KEYS[3]); " +
                "if packageOrderMaxTimes > 0 and packageOrderAmount > packageOrderMaxTimes then  redis.call('DECR', KEYS[1]) ; redis.call('DECR', KEYS[2]); redis.call('DECR', KEYS[3]);  " +
                "result[1] = -104; result[2] = packageOrderMaxTimes; result[3] = packageOrderAmount;  return result end;" +

                "local exists_flag = redis.call('ttl', KEYS[2]); " +
                "if exists_flag == -1 then redis.call('expire', KEYS[2], ARGV[3]) end; " +
                "result[1] = 1; result[2] = userMaxTimes; result[3] = packageOrderDayTimes; result[3] = packageOrderMaxTimes; return result",
        List.class
);

接口触发

List result = stringRedisTemplate.execute(JudgeHitTimesScript, keys,
        String.valueOf(userMaxHitTimes),
        String.valueOf(itemPerDayHitTimes),
        String.valueOf(itemCountTimes), String.valueOf(ttlSeconds));

 

基本语法参考 Lua脚本基础入门及其案例_51CTO博客_lua脚本语言入门 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值