zoukankan      html  css  js  c++  java
  • redis+lua库存扣减和冲正

    package spring;
    import org.redisson.Redisson;
    import org.redisson.api.RScript;
    import org.redisson.api.RedissonClient;
    import org.redisson.config.Config;
    import java.util.ArrayList;
    import java.util.List;
    import static org.redisson.api.RScript.Mode.READ_WRITE;

    /**

    • @author tanxiaokang
    • @description
    • @date 2020/8/4 10:42
      **/

    public class Console {

    public static void main(String[] args) {
        Config config = new Config();
        config.setLockWatchdogTimeout(10000);
        config.useSingleServer().setAddress("redis://127.0.0.1:36379");
        RedissonClient redissonClient = Redisson.create(config);
    
        //扣减库存
        List<Object> keys = new ArrayList<>();
        keys.add("txk");
        Object[] values=new Object[]{1};
        Object eval = redissonClient.getScript().eval(READ_WRITE, RedisLua.REDUCE_INVENTORY, RScript.ReturnType.INTEGER, keys, values);
        System.out.println(eval);
    
    
        //添加库存
        List<Object> keys1 = new ArrayList<>();
        keys1.add("txk");
        Object[] values1=new Object[]{10};
        Object eval1 = redissonClient.getScript().eval(READ_WRITE, RedisLua.ADD_INVENTORY, RScript.ReturnType.INTEGER, keys1, values1);
        System.out.println(eval1);
    }
    
    
    static class RedisLua {
        public static final String REDUCE_INVENTORY;
    
        public static final String ADD_INVENTORY;
    
        static {
            /**
             * @params 库存key
             * @return
             *      -4:代表库存传进来的值是负数(非法值)
             *      -3:库存未初始化
             *      -2:库存不足
             *      -1:库存为0
             *      大于等于0:剩余库存(扣减之后剩余的库存)
             */
            StringBuilder sb = new StringBuilder();
            sb.append("if (redis.call('exists', KEYS[1]) == 1) then");
            sb.append("    local stock = tonumber(redis.call('get', KEYS[1]));");
            sb.append("    local num = tonumber(ARGV[1]);");
            sb.append("    if (num <= 0) then");
            sb.append("        return -4;");
            sb.append("    end;");
            sb.append("    if (stock <= 0) then");
            sb.append("        return -1;");
            sb.append("    end;");
            sb.append("    if (stock >= num) then");
            sb.append("        return redis.call('incrBy', KEYS[1], 0 - num);");
            sb.append("    end;");
            sb.append("    return -2;");
            sb.append("end;");
            sb.append("return -3;");
            REDUCE_INVENTORY = sb.toString();
    
    
    
            /**
             * @params 库存key
             * @return
             *      -4:代表库存传进来的值是负数(非法值)
             *      -3:库存未初始化
             *      大于等于0:剩余库存(新增之后剩余的库存)
             */
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("if (redis.call('exists', KEYS[1]) == 1) then");
            stringBuilder.append("    local num = tonumber(ARGV[1]);");
            stringBuilder.append("    if (num < 0) then");
            stringBuilder.append("        return -4;");
            stringBuilder.append("    end;");
            stringBuilder.append("        return redis.call('incrBy', KEYS[1], num);");
            stringBuilder.append("end;");
            stringBuilder.append("return -3;");
            ADD_INVENTORY=stringBuilder.toString();
        }
    }
    

    }
    以上代码都是针对单商品

  • 相关阅读:
    linux密码登陆时加入自己登陆验证模块(pam),xshell工具可用,xftp工具使用无响应
    新增sftp服务器及用户
    SFTP服务配置以及命令/代码操作
    【OpenSSH】internal-sftp和sftp-server之间的区别和联系什么?
    sshd_config 中文手册:关于ssh 设置的相关总结(ssh最大连接数、ssh连接时长、安全性配置等)
    CentOS下配置SFTP操作日志
    linux中pam认证解析
    linux密码登陆时加入自己登陆验证模块(pam)
    linux syslog详解
    Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  • 原文地址:https://www.cnblogs.com/merciless/p/13607703.html
Copyright © 2011-2022 走看看