版本一
public Boolean lock(String key, Long value) {
ValueOperations valueOperations = redisTemplate.opsForValue();
if (valueOperations.setIfAbsent(key, value)) {
return true;
}
Long current = (Long) valueOperations.get(key);
if (current != null && current < System.currentTimeMillis()) {
// time out
Long old = (Long) valueOperations.getAndSet(key, value);
if (old.equals(current)) {
return true;
}
return false;
}
return false;
}
解說:
1: valueOperations.setIfAbsent(key, value) 對(duì)應(yīng)redis的setnx,原子操作嘱朽。
2: if (current != null && current < System.currentTimeMillis()) 該判斷用于判斷上一個(gè)鎖是否超時(shí)塑陵,如果條件滿足耳贬,意味著已經(jīng)超時(shí)猜惋,可以嘗試獲取了侧漓。
3: Long old = (Long) valueOperations.getAndSet(key, value); 這個(gè)操作就是設(shè)置新值缺前,獲取舊值蛀醉。
4: if (old.equals(current)) 如果條件滿足,意味著沒有其他搶資源衅码,可以獲取拯刁。