5/19/2023
11/26/2024

메모리 기반의 key-value 저장소.

SETNX, SET + NX 간단한 Locking System 구현

2.6.12부터 SETNX Deprecated 되고, setNX 옵션이 추가되었다.

SETNX is short for "SET if Not eXists".

NXNot eXists의 약자로, 해당 키가 존재하지 않을 때만 SET을 수행한다.

The command SET resource-name anystring NX EX max-lock-time is a simple way to implement a locking system with Redis.

SET resource-name anystring NX EX max-lock-time와 같이 사용하는 것은 Redis에서 Locking System을 구현하는 간단한 방법이다.

EX max-lock-time으로 인해 초 단위로 만료 시간을 지정할 수 있다. 잘 설정되었다면 "OK"를 반환하고, 만료 시간이 지나기 전에 다시 호출하면 nil을 반환한다.

이 방식으로 간단한 분산 Locking System을 구현할 수 있다.

클라이언트에서 각자 포인트를 적립, 차감하는 로직이 있다고 가정하자.

Process:

  • 각 클라이언는 위 명령어로 포인트를 처리하기 전에 Locking 한다: SET point-user123 foo NX EX 60
  • 만약 Locking에 실패하면(nil을 반환하면) "다른 클라이언트에서 처리 중입니다."와 같은 메시지를 반환한다.
  • Locking에 성공하면("OK"를 반환하면) 포인트를 처리한다.
  • 처리가 끝나면 DEL point-user123로 Locking을 해제한다.

설령 클라이언트가 처리 중에 비정상 종료되더라도 60초 후에는 Locking이 해제되기 때문에 무한정 Locking 되는 것을 피할 수 있다.

좀 더 견고하게 Unlocking 프로세스를 만들고 싶다면 DEL 명령어를 직접 사용하지 않고, 일련의 해제 프로세스를 호출하는 것이 좋다:

  • foo와 같은 고정 문자열 대신, 랜덤한 문자열을 사용한다.
  • 클라이언트은 포인트 처리 후 해제 프로세스에 위 문자열을 전달한다.
  • 해제 프로세스는 전달 받은 문자열과 GET 명령어로 해당 키의 값을 비교한다.
  • 같으면 DEL 명령어로 Locking을 해제한다.

각 클라이언트에서 직접 삭제하는 대신, 해제 프로세스에 위임하는 방법이다.
이러면 다른 클라이언트가 DEL 명령어로 아무 배경없이 Locking 해제하는 것을 막을 수 있다. Locking 처리한 클라이언트만 해제할 수 있는 일종의 보증 절차를 만드는 것이다.

라이선스를 BSD에서 SSPL로 변경

24년 4월, 클라우드 서비스 대항격인 라이선스 변경을 발표했다.

문제가 되는 SSPL 라이선스는 MongoDB가 처음으로 도입했고, 일반 사용자에게는 영향이 없지만, 클라우드 서비스 업체에는 제약이 생긴다고 한다.

이로 인해 Redis를 호환하는 프로젝트들이 생성되고 있다.