UNLINK

Redis Developer Course Redis Technical Support Redis Enterprise Server

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 RM >>

Email 답글이 올라오면 이메일로 알려드리겠습니다.

패턴으로 값을 조회하고 삭제할 수 있어요.
리스트에서 "lls mylist user*" 이렇게 조회할 수 있구요.
user가 들어간 값들을 삭제하려면 "lrm mylist user*" 이렇게 하면 됩니다.
List에서는 LLS, LRM, Set에서는 SLS, SRM, ZSet에서는 ZLS, ZRM, Hash에서는 HLS, HRM 을 사용하면 됩니다.
게다가 LS는 소트 기능까지 있습니다. 한번 사용해 보세요. ^^
궁금하신 사항이 있으면 여기로 redisgate@gmail.com 메일 주세요.
 
close
IP를 기반으로 보여집니다.