Redis Lists
일반적인 배열과 달리 Linked List를 사용한다. 새로운 원소가 추가되면 리스트의 시작부분이나 끝부분에 추가하게되고 O(1)의 복잡도를 갖는다. 일반적인 배열은 index를 통해 매우 빠르게 접근할 수 있지만 linked list기반의 Redis list에서는 느리다. 데이터베이스에서 아주 긴 리스트에 원소들을 빠르게 추가하기 위해 linked list를 사용한다.
만약 큰 컬렉션의 임의의 원소에 접근하려면 Sorted set을 쓰는것이 더 낫다.
LPUSH/RPUSH 명령어로 각각 리스트의 앞, 뒤에 원소를 추가할 수 있다.
LRANGE 명령어로 해당 리스트의 특정 범위에 해당하는 원소들을 반환 시킬 수 있다. LRANGE는 2개의 인덱스와 함께 호출하며 첫번째 호출된 인덱스부터 두번째 호출된 인덱스까지 출력한다. 두 인덱스는 모두 음수일 수 있다. (양수는 인덱스, 음수는 인덱스의 끝지점부터, -1은 리스트의 마지막 원소), 조회에 사용되는 복잡도는 O(N)
RPUSH/LPUSH 명령어로 한번에 여러 원소들을 추가할 수 있다
LPOP/RPOP 명령어로 해당 리스트의 첫부분과 끝부분에서 POP 할 수 있다.
Redis는 리스트의 원소가 없으면 NULL을 반환한다.
LTRIM 명령어로 해당 리스트를 원하는 범위만큼 잘라낼 수 있다. LRANGE와 비슷하지만 LRANGE는 리스트의 해당 범위를 보여주는 것이고 LTRIM은 그 범위를 잘라서 새로운 리스트로 만든다.
Blocking operations on lists
때때로 리스트가 비어있을 수 있고, 그때 RPOP은 NULL을 반환한다. 이 때 호출자는 강제로 RPOP에 대해 재시도 하며 대기하게 된다. 이것을 폴링이라고 하며, 좋은 현상이 아니다. 만약 리스트가 정말 비어있을경우에는 어떤 일도 하지 않고 기다렸다가 NULL을 반환할 것이다. 하지만 아이템을 추가하는데 필요한 지연시간 때문에 NULL을 반환 받게 되는 경우도 있다. 이러한 경우 BRPOP와 BLPOP으로 리스트가 비어있을때 block을 걸 수 있다. (영어로 설명돼있어서 헷갈림) 만약 임의의 시간동안 값이 추가되지 않으면 그대로 NULL을 반환하고 아닌경우에는 해당 값을 반환한다.
BRPOP tasks 5
// wait for elements in the list tasks, but return if after 5 seconds no element is available
타임아웃 시간을 0으로 주면 영원히 기다리게 할 수 있다. 만약 여러 값이 동시에 들어온다면 반영되길 기다렸다가 해당하는 값을 반환하게 된다.
RPOP은 키의 이름을 포함한 two-element array 이지만 BRPOP과 BLPOP은 여러 리스트의 원소들을 기다리게 할 수 있다.
LMOVE/BLMOVE 사용법 더 찾아보기
Automatic creation and removal of keys
1. 어떤 데이터 타입의 원소를 추가할 때 해당 키가 없으면 해당 데이터 타입의 빈 리스트를 생성해서 원소를 추가한다.
mylist는 integer 리스트이며, 여기에 string을 추가하려고 하지만 타입이 달라 실패한다.
2. Stream data type을 제외하고 값이 남아있지 않다면 자동적으로 삭제된다.
3. 키 없이 LLEN(length of the list)같은 읽기전용 명령어, 원소를 삭제하는 명령어들은 키의 원소가 없는것과 같은 결과를 반환한다.
'DB > Redis' 카테고리의 다른 글
Redis 외부접속 설정하기 (0) | 2021.01.11 |
---|---|
Redis 기본정리 5 (0) | 2021.01.08 |
Redis 기본정리 4 (0) | 2021.01.08 |
Redis 기본 정리3 (0) | 2021.01.08 |
Redis 기본 정리 (0) | 2021.01.07 |
댓글