自定义一个类SimpleRedisLock提供分布式锁
获取锁:(key是前缀+userID,value是随机UUID+线程id)
@Override
public boolean tryLock(long timeoutSec) {
//线程标识
String threadId=ID_PREFIX+Thread.currentThread().getId();
Boolean success=stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX+name,threadId,timeoutSec, TimeUnit.SECONDS);
return Boolean.TRUE.equals(success);
}
释放锁,注意要判断释放的锁是否是当前线程的锁,并且为了保证原子性,用lua脚本来完成
脚本:
if(redis.call('get',KEYS[1])==ARGV[1]) then
return redis.call('del',KEYS[1])
end
return 0
unlock方法:
@Override
public void unlock() {
//调用lua脚本,保证原子性
stringRedisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(KEY_PREFIX+name),ID_PREFIX+Thread.currentThread().getId());
}