Redisson 을 이용한 Distributed Lock

Bonjugi·2022년 12월 25일
0
post-custom-banner

Redisson?

하이버커넥트 기술블로그 레디스와 분산 락(1/2) - 레디스를 활용한 분산 락과 안전하고 빠른 락의 구현 를 보고 활용하면 좋겠단 생각을 했다.

락 구현방식 2가지를 소개하고 있다.

  • Lettuce 를 이용한 간단한 분산 락 구현
  • Redisson 을 이용하여 pubsub 를 활용한 락 구현

위 블로그에서는 Redisson 의 장점을 Lettuce 와 비교 우위 장점 3가지를 소개 하고 있다.
1. Lock에 타임아웃이 구현 되어 있습니다.
2. 스핀 락을 사용하지 않습니다.
3. Lua 스크립트를 사용합니다.

Redisson의 특이한 점은 직접 레디스의 명령어를 제공하지 않고, Bucket이나 Map같은 자료구조나 Lock같은 특정한 구현체의 형태로 제공한다는 것입니다.

Redisson을 이용한 Distributed 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 구현 예제

보일러플레이트가 많으니 AOP 로 구현하면 좋겠다 싶었는데 마침 잘 구현하고 테스트까지 추가해주신 github repo 가 있어서 링크 한다.

https://devoong2.tistory.com/entry/Spring-Redisson-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-Distribute-Lock-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%B2%98%EB%A6%AC-1

그밖에..

Redisson의 Reactive Style, Async Style 지원

출처 : https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers

분산 오브젝트, 컬렉션 지원

Redisson 위키를 보면 Distributed object, Distributed Collections 가 상당히 많다.

  • RateLimiter
  • AtomicLong (or AtomicDouble)
  • LongAdder // AtomicLong 보다 최대 12000배 빠르다고 한다.
  • SortedSet

https://github.com/redisson/redisson/wiki/Table-of-Content

post-custom-banner

0개의 댓글