하이버커넥트 기술블로그 레디스와 분산 락(1/2) - 레디스를 활용한 분산 락과 안전하고 빠른 락의 구현 를 보고 활용하면 좋겠단 생각을 했다.
락 구현방식 2가지를 소개하고 있다.
위 블로그에서는 Redisson 의 장점을 Lettuce 와 비교 우위 장점 3가지를 소개 하고 있다.
1. Lock에 타임아웃이 구현 되어 있습니다.
2. 스핀 락을 사용하지 않습니다.
3. Lua 스크립트를 사용합니다.
Redisson의 특이한 점은 직접 레디스의 명령어를 제공하지 않고, Bucket
이나 Map
같은 자료구조나 Lock
같은 특정한 구현체의 형태로 제공한다는 것입니다.
예제 코드를 보면 다음과 같습니다.
@Slf4j
@RestController
@RequiredArgsConstructor
public class SampleService {
private final RedissonClient redissonClient;
@GetMapping("/hello")
public String hello() {
RLock lock = redissonClient.getLock("lock-name-hello");
try {
if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {
log.info("lock 을 획득하여 로직을 수행합니다.");
lock.unlock();
return "succeed";
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
if (lock.isLocked()) {
lock.unlock();
}
}
log.error("락을 획득할수 없어 로직을 수행하지 않았습니다.");
return "failed";
}
}
보일러플레이트가 많으니 AOP 로 구현하면 좋겠다 싶었는데 마침 잘 구현하고 테스트까지 추가해주신 github repo 가 있어서 링크 한다.
출처 : https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers
Redisson 위키를 보면 Distributed object
, Distributed Collections
가 상당히 많다.