利用RedisTemplate实现最简单的分布式锁

使用redis做分布式锁,需要在一个原子操作里实现设置指定key的value,以及过期时间,否则当加锁完成后线程异常,未设置过期时间,导致锁永远无法释放。

Redis本身提供了原子方法,SET key value [expiration EX seconds|PX milliseconds] [NX|XX],无需使用lua脚本,也可实现分布式锁。

示例代码:

    @Autowired
    private StringRedisTemplate redisTemplate;

    private boolean lock(String key) {
        RedisSerializer<String> stringSerializer = (RedisSerializer<String>) redisTemplate.getKeySerializer();
        Boolean executeResult = redisTemplate.execute(connection -> connection
            .set(stringSerializer.serialize(key), stringSerializer.serialize("LOCK"), Expiration.from(10, TimeUnit.SECONDS),
                SetOption.SET_IF_ABSENT), true);
        return executeResult;
    }

    private void releaseLock(String key) {
        redisTemplate.delete(key);
    }

© 2019, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记