redis锁用法java代码
redis锁java工具类代码
·
由于redis是串行的,所以可以用redis实现锁机制。
下方是java代码:
@Component
@Slf4j
public class RedisSingleLock {
private final StringRedisTemplate redis;
public SimpleDistributedLock(StringRedisTemplate redis) {
this.redis = redis;
}
//这个方法,可以传入key加锁;多线程调用时,只有1个能获取锁成功,其它线程则会进入循环,不停尝试获取锁
public void lock(String key) {
do {
Boolean lockSuccess = redis.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);
if (lockSuccess == null) {
throw new IllegalStateException();
}
if (!lockSuccess) {
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
} else {
break;
}
} while (true);
}
//这个方法,传入key释放锁,当持有锁的线程执行业务代码完毕后调用,释放这个锁;上方某一个在lock方法中循环尝试获得锁的线程可以获得锁,另外的线程则继续循环等待
public void releaseLock(String key) {
redis.delete(key);
}
//这个方法只尝试获取一次锁,返回获取结果
public boolean tryLock(String key) {
Boolean lockSuccess = redis.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);
if (lockSuccess == null) {
throw new IllegalStateException();
}
return lockSuccess;
}
}
更多推荐
已为社区贡献9条内容
所有评论(0)