unlink
UNLINK
Redis 開発者教育 Redis Developer Course |
Redis 定期点検/技術支援 Redis Technical Support |
Redis エンタープライズサーバ 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)로 삭제한다.
- unlinkCommand() <db.c>: 명령 시작
- delGenericCommand(async) <db.c>: 통합 삭제 명령, async로 삭제 요청
- dbAsyncDelete() <lazyfree.c>: Async로 삭제 처리
- dictUnlink() <dict.c>: 키 삭제, 키는 바로(sync)로 삭제한다.
- lazyfreeGetFreeEffort() <lazyfree.c>: 멤버수를 리턴한다. String은 항상 1을 리턴하다.
- 멤버수가 64개 이하일 경우에는 DEL과 같이 바로(sync) 삭제한다. 왜냐하면 맴버수가 적을 경우에는 별도 쓰레드로 처리하는 것이 시간이 더 오래걸리기 때문이다.
- bioCreateBackgroundJob(BIO_LAZY_FREE) <lazyfree.c>: 멤버수가 64개를 초과하면 별도 쓰레드로 백그라운드로 값을 삭제(메모리 해제)한다.
Subquery(서브쿼리) 기능
Key(키) 부분에 서브쿼리를 사용해서 키를 삭제할 수 있습니다.
서브쿼리로 사용할 수 있는 명령은 GET, MGET, LPOP, RPOP, LRANGE,
SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE,
HGET, HMGET, HKEYS, HVALS, HGETALL, KEYS 입니다.
Example
명령> | set mykey myvalue |
결과> | OK |
명령> | set key mykey |
결과> | OK |
명령> | unlink (get key) |
결과> | 1 |
Example
명령> | lpush mylist mykey1 mykey2 mykey3 |
결과> | 3 |
명령> | unlink (lrange mylist 0 -1) |
결과> | 3 |
Example
명령> | unlink (keys user*) |
결과> | 10 |
명령> | unlink (keys * string) |
결과> | 20 |
Example
명령> | unlink (lrange mylist 0 -1) (sunion myset1 myset2) mykey10 |
결과> | 10 |
서브쿼리 기능은 Enterprise 서버에서 사용 가능합니다. |
명령문
UNLINK key [key ...] | (subquery)
- 이 명령은 version 4.0.0 부터 사용할 수 있다.
- 논리적 처리 소요시간은 O(1)이다. 하지만 별도 쓰레드에서 값을 삭제(메모리 해제)하는데 소요시간은 O(N)이다. 여기서 N은 멤버수이다.
관련 명령 | DEL |
Clients for Java | Jedis, Lettuce, Redisson | Clients for C | Hiredis |
<< EXISTS | UNLINK | KEYS >> |
---|
조회수 :
Email
返事がかかってなれば、メールでお知らせします。