使用Redis做全局锁、接口请求排队
1.redis锁工具类
private final static long LOCK_EXPIRE = 30 * 1000L; // 锁过期时间:单个业务持有锁的时间30s,防止死锁
private final static long LOCK_TRY_INTERVAL = 500L; // 获取锁时间:默认0.5s再获取一次锁
private final static long LOCK_TRY_TIMEOUT = 30 * 1000L; // 请求超时时间:默认尝试30s
@Autowired
private StringRedisTemplate redisTemplate;
public boolean getLock(String lockName, String lockValue) {
try {
if (StringUtils.isEmpty(lockName) || StringUtils.isEmpty(lockValue)) {
return false;
}
long startTime = System.currentTimeMillis();
do{
// 查询锁是否存在
if (!redisTemplate.hasKey(lockName)) {
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set(lockName, lockValue, LOCK_EXPIRE, TimeUnit.MILLISECONDS);
return true;
}
//尝试超过了设定值之后直接跳出循环
if (System.currentTimeMill