java编写redis+lua脚本分布式锁

1 不可重入锁

    @GetMapping("/test")
    public JsonData test(@RequestParam(name="key")String key,@RequestParam(name="accountNo")Long accountNo){
        //key[1]是key,ARGV[1]是accountNo,ARGV[2]是过期时间
        //判断key是否存在
        String script = "if redis.call('EXISTS',KEYS[1])==0 then" +
                //不存在则设置key和value
                " redis.call('set',KEYS[1],ARGV[1]);" +
                //设置过期时间
                " redis.call('expire',KEYS[1],ARGV[2]); " +
                //返回1
                "return 1;" +
                //不相同返回0
                " else return 0;" +
                " end;";

        Long result = redisTemplate.execute(new
                DefaultRedisScript<>(script, Long.class), Arrays.asList(key), accountNo,100);
        return JsonData.buildSuccess(result);

    }

1 可重入锁

    @GetMapping("/test")
    public JsonData test(@RequestParam(name="key")String key,@RequestParam(name="accountNo")Long accountNo){
        //key[1]是key,ARGV[1]是accountNo,ARGV[2]是过期时间
        //判断key是否存在
        String script = "if redis.call('EXISTS',KEYS[1])==0 then" +
                //不存在则设置key和value
                " redis.call('set',KEYS[1],ARGV[1]);" +
                //设置过期时间
                " redis.call('expire',KEYS[1],ARGV[2]); " +
                //返回1
                "return 1;" +
                //如果存在则判断value是否相同
                " elseif redis.call('get',KEYS[1]) == ARGV[1] then" +
                //可重入返回2
                " return 2;" +
                //不相同返回0
                " else return 0;" +
                " end;";

        Long result = redisTemplate.execute(new
                DefaultRedisScript<>(script, Long.class), Arrays.asList(key), accountNo,100);
        return JsonData.buildSuccess(result);

    }

版权声明:本文为BCDMW233原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。