-
개발자를 위한 레디스 - 3장: 레디스 기본 개념 (2) 레디스에서 키를 관리하는 법NoSQL/Redis 2024. 4. 11. 23:12
2. 레디스에서 키를 관리하는 법
1) 키의 자동 생성과 삭제
Stream, Set, Sorted Set, Hash와 같이 하나의 키가 여러 개의 아이템을 가지고 있는 자료 구조에서는 자동으로 키가 생성되고 삭제된다. 키 생성의 세 가지 공통적인 규칙은 아래와 같다.
- 키가 존재하지 않을 때 아이템을 넣으면 아이템을 삽입하기 전에 빈 자료 구조를 생성
- 모든 아이템을 삭제하면 자동으로 키도 삭제 (Stream은 제외)
- 키가 없는 상태에서 키 삭제, 아이템 삭제, 자료 구조 크기 조회 같은 읽기 전용 커맨드를 수행하면 에러 반환 대신 키가 있지만 아이템이 없는 것처럼 동작
2) 키와 관련된 커맨드
(1) 키 조회: EXISTS
// EXISTS key [key ...] > SET hello world OK // 키가 존재하면 1 반환 > EXISTS hello (integer) 1 // 키가 존재하지 않으면 0 반환 > EXISTS world (integer) 0
(2) 키 조회: KEYS
// KEYS pattern // 레디스에 저장된 모든 키를 조회 // (Glob pattern 스타일로 동작) // h?llo -> hello, hallo, ... // h*llo -> hllo, heeeello, ... // h[ae]llo -> hello, hallo // h[^e]llo -> hallo, hbllo, ... (hello 매칭 안됨) // h[a-b]llo -> hallo, hbllo
KEYS는 위험한 커맨드인데, 레디스에 100만개의 키가 저장되어 있다면 모든 키의 정보를 반환한다. 레디스는 싱글 스래드로 동작하기에 시간이 오래 걸리는 커맨드를 수행하면 그 동안 다른 클라이언트의 요청이 차단됨에 유의.
(3) 키 조회: SCAN
커서를 기반으로 특정 범위의 키만 조회. KEYS를 대체하여 조회할 때 사용할 수 있다.
// SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] > SCAN 0 1) "17" // -> 다음 SCAN을 사용할 때 인수로 사용해야 하는 커서 위치 2) 1) "key:12" 2) "key:8" 3) "key:4" 4) "key:14" 5) "key:16" 6) "key:17" 7) "key:15" 8) "key:10" 9) "key:3" 10) "key:7" 11) "key:1" > SCAN 17 1) "0" // -> "0"을 반환하면 더 이상 검색할 키가 없다는 뜻 2) 1) "key:5" 2) "key:18" 3) "key:0" 4) "key:2" 5) "key:19" 6) "key:13" 7) "key:6" 8) "key:9" 9) "key:11"
SCAN 에서의 MATCH 옵션은 조회된 결과에서 수행하므로 KEYS와는 조금 다르게 동작된다. 또한, COUNT 옵션도 메모리를 스캔하며 데이터가 저장된 형상에 따라 몇 개의 키를 더 읽는게 효율적이라 생각되면 1~2개 더 읽어서 반환하기에 매개변수의 값만큼 키가 반환되지 않을 수 있다. TYPE옵션을 이용하면 특정 타입의 키만 조회할 수 있는데, 이 또한 MATCH옵션처럼 조회된 결과에서 필터링함에 유의.
SCAN과 유사한 커맨드로 SSCAN, HSCAN, ZSCAN이 있는데 각각 Set, Hash, Sorted Set에서 아이템을 조회하기 위해 사용되는 SMEMBERS, HGETALL, ZRANGE WITH SCORES를 대체하여 서버에 영향을 주지 않는 커맨드이다.
(4) 키 정렬: SORT
List, Set, Sorted Set에서만 사용할 수 있는 커맨드로 키 내부의 아이템을 정렬해 반환한다.// SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
> LPUSH mylist a (integer) 1 > LPUSH mylist b (integer) 2 > LPUSH mylist c (integer) 3 > LPUSH mylist hello (integer) 4 > SORT mylist (error) ERR One or more scores can't be converted into double > SORT mylist ALPHA 1) "a" 2) "b" 3) "c" 4) "hello"
(5) 키 이름 변경: RENAME / RENAMENX
RENAME key newkey RENAMENX key newkey // -> 변경할 키가 존재하지 않을 때만 동작
> SET a apple OK > SET b banana OK > RENAME a aa OK > GET aa "apple" > SET a apple OK > RENAMENX a b (integer) 0 > GET b "banana"
(6) 키 복사: COPY
// COPY source desitination [DB destination-db] [REPLACE]
source에 지정된 키를 destination에 복사한다. destination에 이미 키가 있는 경우 에러가 반환되는데, REPLACE 옵션을 사용하면 키를 삭제한 뒤 값을 복사할 수 있다.
(7) 키 정보: OBJECT
// OBJECT <subcommand> [<arg> [value] [opt] ...]
키에 대한 상세 정보를 반환한다. subcommand에는 ENCODING, IDLETIME등이 있다.
(8) 키 삭제: FLUSHALL
FLUSHALL [ASYNC|SYNC]
레디스에 저장된 모든 키를 삭제한다. 기본적으로는 SYNC로 동작하고 ASYNC옵션으로 삭제할 수도 있는데, 이 경우 삭제 동작을 하는 도중 새로 생성된 키들은 삭제되지 않는다.
lazyfree-layzy-user-flush 옵션이 yes인 경우 ASYNC없이 사용하더라도 ASYNC처럼 동작한다. (기본값: no)
(9) 키 삭제: DEL
// DEL key [key ...]
키와 키에 저장된 모든 아이템을 삭제한다. (동기식)
(10) 키 삭제: UNLINK
// UNLINK key [key ...]
키와 데이터를 삭제하는 명령어로 DEL과 비슷하지만, 우선 키와 연결된 데이터의 연결을 끊고 백그라운드에서 다른 스레드에 의해 처리되는 차이가 있다. 키에 저장된 데이터가 많은 경우에 사용하는것이 좋다.
(11) 키 만료 시간: EXPIRE
// EXPIRE key seconds [NX|XX|GT|LT]
키가 만료될 시간을 초 단위로 지정할 수 있다.
- NX: 해당 키에 만료 시간이 정의돼 있지 않을 경우에만 커맨드 수행
- XX: 해당 키에 만료 시간이 정의돼 있을 때만 커맨드 수행
- GT: 현재 키가 가지고 있는 만료 시간보다 새로 입력한 초가 더 클 때만 수행
- LT: 현재 키가 가지고 잇는 만료 시간보다 새로 입력한 초가 더 작을 때만 수행
(12) 키 만료 시간: EXPIREAT
// EXPIREAT key unix-time-seconds [NX|XX|GT|LT]
키가 특정 유닉스 타임스탬프에 만료될 수 있도록 직접 시간 지정.
(13) 키 만료 시간: EXPIRETIME
// EXPIRETIME key
키가 삭제되는 유닉스 타임스탬프를 초 단위로 반환. 키가 존재하지만 만료시간이 없는 경우 -1, 키가 없는 경우 -2를 반환.
(14) 키 만료 시간: TTL
// TTL key
키가 몇 초 뒤에 만료되는지 반환. 키가 존재하지만 만료시간이 없는 경우 -1, 키가 없는 경우 -2를 반환.
(15) 키 만료 시간: 밀리초 단위
PEXPIRE, PEXPIREAT, PEXPIRTETIME, PTTL은 (11-14)와 동일하며, 밀리초 단위로 계산된다.
'NoSQL > Redis' 카테고리의 다른 글
개발자를 위한 레디스 - 5장: 레디스를 캐시로 사용하기 (0) 2024.05.06 개발자를 위한 레디스 - 8장: 복제 (0) 2024.05.06 개발자를 위한 레디스 - 7장: 레디스 데이터 백업 방법 (0) 2024.05.02 개발자를 위한 레디스 - 4장: 레디스 자료구조 활용 사례 (1) 2024.04.28 개발자를 위한 레디스 - 3장: 레디스 기본 개념 (1) 레디스의 자료 구조 (0) 2024.04.11