UNLINK

<< EXISTS KEYS >>

Key 삭제

이 명령은 Redis 4.0에서 추가된 것으로 DEL과 다른 점은 비동기(async)로 별도 쓰레드에서 백그라운드로 실행된다는 점이다.   따라서 collection 데이터타입에 멤버수가 많은 경우 DEL 보다 훨씬 빠르게 처리된다.

성능 테스트

Set 데이터 타입 키 하나에 10만개의 멤버를 넣고 DEL과 UNLINK로 각각 삭제하고 SLOWLOG로 처리 시간을 측정했다. 값이 차지하는 메모리는 약 12MB였다.

  • DEL 명령으로 삭제 시간: 44,217 microsecond
  • UNLINK 명령으로 삭제 시간: 25 microsecond
  • 처리 시간 비교: UNLINK가 약 1700배 빠르다.   멤버수가 많아 키 삭제 시간이 많이 걸려서 성능에 문제가 될 경우 이 명령을 사용하시기 바랍니다.

내부 구조

키 삭제는 동기(sync)로 하고 값 삭제를 별도의 쓰레드에서 비동기(async)로 처리한다.   하지만 멤버수가 64개 이하일 경우에는 DEL과 같이 동기(sync)로 삭제한다.

  1. unlinkCommand() <db.c>: 명령 시작
  2. delGenericCommand(async) <db.c>: 통합 삭제 명령, async로 삭제 요청
  3. dbAsyncDelete() <lazyfree.c>: Async로 삭제 처리
    1. dictUnlink() <dict.c>: 키 삭제, 키는 바로(sync)로 삭제한다.
    2. lazyfreeGetFreeEffort() <lazyfree.c>: 멤버수를 리턴한다. String은 항상 1을 리턴하다.
    3. 멤버수가 64개 이하일 경우에는 DEL과 같이 바로(sync) 삭제한다. 왜냐하면 맴버수가 적을 경우에는 별도 쓰레드로 처리하는 것이 시간이 더 오래걸리기 때문이다.
    4. bioCreateBackgroundJob(BIO_LAZY_FREE) <lazyfree.c>: 멤버수가 64개를 초과하면 별도 쓰레드로 백그라운드로 값을 삭제(메모리 해제)한다.

명령문

UNLINK key [key ...]

  • 이 명령은 version 4.0.0 부터 사용할 수 있다.
  • 논리적 처리 소요시간은 O(1)이다. 하지만 별도 쓰레드에서 값을 삭제(메모리 해제)하는데 소요시간은 O(N)이다. 여기서 N은 멤버수이다.
관련 명령 DEL
Clients for Java Jedis, Lettuce, Redisson
Clients for C Hiredis

<< EXISTS UNLINK KEYS >>

질문하거나 댓글을 보려면 클릭하세요.  댓글수 :    조회수 :

Email 返事がかかってなれば、メールでお知らせします。