2023-08-04-TIL
Today I Learned
Jedis Lock
여러 서버가 같은 자원을 동시에 고치지 못하게 하려면 서버 바깥에 잠금이 필요하다. Redis는 이 용도로 자주 쓰인다. jedis-lock은 Jedis 드라이버 위에서 Redis 분산 락을 간단히 쓰게 해 주는 라이브러리다. README의 사용법은 JedisLock을 만들고 acquire()로 잠근 뒤, 작업이 끝나면 finally에서 release()를 부르는 형태다.
내부 원리는 Redis 공식 문서의 분산 락 패턴을 보면 이해된다. 단일 Redis 인스턴스에서 잠금을 잡는 기본 명령은 다음과 같다.
1
SET resource_name my_random_value NX PX 30000
NX: 키가 없을 때만 저장한다. 먼저 저장한 클라이언트만 잠금을 얻는다.PX 30000: 30초 뒤 키가 자동으로 사라진다. 잠금을 잡은 프로세스가 죽어도 영원히 잠기지 않는다.- 랜덤 값: 해제할 때 “내가 넣은 값일 때만 지운다”를 확인하는 데 쓴다. 그냥
DEL을 하면, 내 잠금이 만료된 뒤 다른 클라이언트가 잡은 잠금을 지워 버릴 수 있다. 그래서 값 비교와 삭제를 Lua 스크립트로 묶어 원자적으로 실행한다.
같은 문서는 마스터와 복제본을 둔 구성만으로는 부족하다고 설명한다. Redis 복제는 비동기라서, 마스터가 잠금 키를 복제하기 전에 죽으면 승격된 복제본에서 다른 클라이언트가 같은 잠금을 또 얻을 수 있다. 이 문제를 줄이려고 제안한 방식이 여러 독립 마스터의 과반에서 잠금을 얻는 Redlock이다. Java 구현으로는 Redisson이 소개되어 있다.
- https://github.com/abelaska/jedis-lock
- https://www.javadoc.io/doc/ai.grakn/grakn-engine/1.4.0/ai/grakn/engine/lock/JedisLock.html
- https://stackoverflow.com/questions/43601878/how-to-lock-redis-cluster-for-an-application-in-java
- https://redis.com/blog/jedis-vs-lettuce-an-exploration/
Jedis vs Lettuce
둘 다 Java용 Redis 클라이언트다. Redis 블로그의 비교 글을 기준으로 차이를 정리하면 다음과 같다.
- Jedis: 사용법이 단순하다. 대신
Jedis연결 객체는 스레드 안전하지 않아서 스레드끼리 공유하면 프로토콜 오류가 난다. 멀티 스레드에서는JedisPool에서 연결을 빌려 쓰고 반납한다. 연결이 동기식이라 응답을 기다리는 동안 연결이 놀게 된다. - Lettuce: 완전한 논블로킹 클라이언트다. 동기, 비동기, 리액티브 API를 모두 제공하고 클러스터와도 비동기로 통신할 수 있다. 대신 설정 코드가 조금 더 길다.
Spring Boot 2.0 문서를 보면 spring-boot-starter-data-redis는 기본으로 Lettuce를 쓰고, 자동 설정은 Lettuce와 Jedis를 모두 지원한다(Spring Boot 2.0 문서).
- https://jojoldu.tistory.com/418
- https://docs.google.com/presentation/d/1FtEFBCubpcqMJ6C7YV55KAxjhZ5znYn6A3f1c341Lcg/edit#slide=id.g25a881cd3a5_0_446
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.
댓글
아직 댓글이 없습니다