• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

redis+lua库存扣减和冲正

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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();
    }
}

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua代码优化(转)发布时间:2022-07-22
下一篇:
[COCOS2DX-LUA]0-003.根据COCOS2DX热更新发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap