1. maven配置

<dependencies>
    <!-- Spring Boot Starter for Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!-- Lettuce client (可选,作为Redis客户端) -->
    <dependency>
        <groupId>io.lettuce</groupId>
        <artifactId>lettuce-core</artifactId>
    </dependency>
</dependencies>

2. 实现分布式锁util

@Component
public class RedisLockUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 加锁
     * @param key 锁的key
     * @param value 锁的value
     * @param timeout 锁的超时时间,单位为毫秒
     * @return 是否成功获取锁
     */
    public boolean lock(String key, String value, long timeout) {
        Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(key, value);
        if (result != null && result) {
            stringRedisTemplate.expire(key, timeout, TimeUnit.MILLISECONDS);
            return true;
        }
        return false;
    }

    /**
     * 解锁
     * @param key 锁的key
     * @param value 锁的value
     * @return 是否成功释放锁
     */
    public boolean unlock(String key, String value) {
        String currentValue = stringRedisTemplate.opsForValue().get(key);
        if (currentValue != null && currentValue.equals(value)) {
            return stringRedisTemplate.delete(key);
        }
        return false;
    }

}

3. 使用分布式锁


        if (redisLockUtil.lock(lockKey, lockValue, accessTokenLockTimeout)) { // 加锁
            try {

               // 程序 todo

            } catch (Exception e) {
                // 异常 e.getMessage() todo
            } finally {
                redisLockUtil.unlock(lockKey, lockValue); // 释放锁
            }
        } else {
             // log.info("加锁失败!");
            throw new RuntimeException("原因:加锁失败!");
        }

Logo

更多推荐