SpringBoot使用 redisTemplate DIY 分布式锁

2023/03/01 Spring 共 868 字,约 3 分钟
Bob.Zhu

未实现看门狗的版本

已应用于 cloud-aiot 项目:

./redis-lock/RedisDistributedLock.java

public static @NotNull JSONObject getTokenObj(String username, String password) throws IOException {
    Object token = redisTemplate.opsForValue().get(redisKey(username));
    // 不为空直接返回,不使用全局锁,增加执行效率
    if (Objects.isNull(token)) {
        // 如果为空,则取锁,重新获取token
        boolean lock = redisDistributedLock.getLock(lockKey(), lockKey(), 3000, 5000);
        if (lock) {
            token = redisTemplate.opsForValue().get(redisKey(username));
            // 双重判断,避免上一次获取锁的线程已经重新获取过token,如果再次判断唯恐,则重新获取token
            if (Objects.isNull(token)){
                try {
                    token = refreshToken(username, password);
                } finally {
                    redisDistributedLock.unLock(lockKey(), lockKey());
                }
            }
        } else {
            throw new SystemException(RPC_ERROR);
        }
    }
    return (JSONObject) token;
}

参考资料

开始写作吧

![image-alter](/image/post/2023/03/01/02/xxx.jpg)

文档信息

Search

    Table of Contents