You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.1 KiB
37 lines
1.1 KiB
package com.example.demo.Util;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
@Component
|
|
public class RedisLockUtil {
|
|
|
|
@Autowired
|
|
private StringRedisTemplate redisTemplate;
|
|
|
|
/**
|
|
* 尝试获取分布式锁
|
|
* @param lockKey 锁的 Key
|
|
* @param requestId 请求 ID(可用 UUID)
|
|
* @param expireTime 锁的过期时间(毫秒)
|
|
* @return 是否获取成功
|
|
*/
|
|
public boolean tryLock(String lockKey, String requestId, long expireTime) {
|
|
return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.MILLISECONDS);
|
|
}
|
|
|
|
/**
|
|
* 释放分布式锁
|
|
* @param lockKey 锁的 Key
|
|
* @param requestId 请求 ID
|
|
*/
|
|
public void unlock(String lockKey, String requestId) {
|
|
String currentValue = redisTemplate.opsForValue().get(lockKey);
|
|
if (requestId.equals(currentValue)) {
|
|
redisTemplate.delete(lockKey);
|
|
}
|
|
}
|
|
}
|