使用redis分布式锁(主要使用了redis中的setnx和getset方法,这两个方法在redisTemplate分别是setIfAbsent和getAndSet方法)实现线程安全,因为redis是单线程,能保证线程的安全性,而且redis强大的读写能力能提高效率。
setnx 如果key已经存在,不做任何操作,返回false ,如果不存在,则set进去,返回true
代码如下:
public static boolean lock(String lock, long time) {
//进入锁的时间
long start = System.currentTimeMillis();
try {
while (true) {
//判断等待时间是否已超时
if (System.currentTimeMillis() - start > WAIT_TIME_LOCK) {
return false;
}
//加锁操作
if (StringUtils.isNotBlank(lock)) {
Boolean absent = redisTemplate.opsForValue().setIfAbsent(lock, lock, time, TimeUnit.SECONDS);
//加锁成功,返回
if (absent) {
return true;
}
}
return false;
}
} catch (Exception e) {
return false;
}
}
public static void unLock(String lock) {
try {
Object o = redisTemplate.opsForValue().get(lock);
if (o != null && StringUtils.equals(o.toString(), lock)) {
redisTemplate.delete(lock);
}
} catch (Exception e) {
e.printStackTrace();
}
}