微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 RedisTemplate 和 Redis 实现锁的功能

private static final Long EXEC_RESULT = 1L;

    private static DefaultRedisScript<Long> redisScript = new DefaultRedisScript<Long>();

    private static RedisSerializer<String> argsSerializer = new StringRedisSerializer();

    private static RedisSerializer resultSerializer = new StringRedisSerializer();

    @Resource
    private Redistemplate<String, Object> redistemplate;

    @Override
    public boolean getdistributedLock(String key, String requestId, String expireTime) {
        String script =
            "if redis.call('setNx',KEYS[1],ARGV[1]) then " +
            "    if redis.call('get',KEYS[1])==ARGV[1] then " +
            "        return redis.call('expire',KEYS[1],ARGV[2]) " +
            "    else " +
            "        return 0 " +
            "    end " +
            "end";
        redisScript.setScriptText(script);
        redisScript.setResultType(Long.class);
        Long result = redistemplate.execute(redisScript, argsSerializer, resultSerializer, Collections.singletonList(key), requestId, expireTime);
        System.out.println("获取锁:" + result);
        return EXEC_RESULT.equals(result);
    }

    @Override
    public boolean releasedistributedLock(String key, String requestId) {
        String script =
            "if redis.call('get',KEYS[1]) == ARGV[1] then " +
            "    return redis.call('del',KEYS[1]) " +
            "else " +
            "    return 0 " +
            "end";
        redisScript.setScriptText(script);
        redisScript.setResultType(Long.class);
        Long result = redistemplate.execute(redisScript, argsSerializer, resultSerializer, Collections.singletonList(key), requestId);
        System.out.println("释放锁:" + result);
        return EXEC_RESULT.equals(result);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐