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

    }
经验分享 程序员 微信小程序 职场和发展