본문 바로가기

IT/Redis

3장 Redis 자료구조

반응형

String - Key/Value 형태로 유일하게 1:1 매핑 구조인 자료구조임

모든 자료구조는 Set을 통해 기존 키에 새로운 값을 넣으면 덮어쓰여짐

 

[Set 옵션]

NX 옵션 - 새로운 값으로 저장되는걸 막을 수 있음

XX 옵션 - 키가 있는 경우에만 새로운 값으로 저장할 수 있음

 

String은 숫자형태도 저장이 가능한데 이때 INCR/DECR을 통해 1씩 증가/감소 시킬 수 있고 INCRBY/DECRBY로 입력한 값을 증가/감소 시킬 수 있음.

 

이때 INCR/DECR 같은 커맨드는 원자적이기 때문에 동시 호출에 대한 원자성이 보장됨 

- 예로 A, B에서 동시에 10이라는 데이터를 갖은 키에 INCR 커맨드를 호출하더라고 하나의 커맨드만 수행되어 10에서 11로 변경됨

 

MSET/MGET 커맨드를 통해 여러개의 키를 한번에 조작할 수 있음

 

List - 순서를 갖은 문자열 목록임 (최대 42억여 개의 아이템 저장 가능)

배열처럼 사용할 수도 있지만 일반적으로 서비스에서 스택/큐로서 사용함

 

LPUSH/RPUSH - 왼쪽/오른쪽으로 데이터 추가

LRANGE - 리스트에 있는 데이터 조회 (LRANGE 0 -1 : 리스트에 있는 모든 데이터 조회)

LPOP - 리스트에 있는 왼쪽 데이터를 조회한 뒤 리스트에서 삭제

LTRIM - 리스트 왼쪽을 기준으로 지정한 범위외에 데이터를 모두 삭제 (단, POP과 다르게 데이터를 반환하지 않음)

LINSERT - 리스트에서 원하는 데이터의 앞 또는 뒤에 데이터를 추가(BEFORE, AFTER 옵션 존재)

LSET - 리스트에서 지정한 인덱스에 있는 데이터를 수정

LINDEX - 리스트에서 지정한 인덱스의 데이터를 조회

 

Hash - 필드-값 쌍을 가진 아이템의 집합임 (객체를 표현하기 적절한 자료구조임 - 데이터베이스 테이블 데이터로 변환도 가능함)

 

데이터베이스와 다르게 레디스에선 Hash에 필드를 추가하는게 간단함 (hash는 각 아이템마다 다른 필드를 가질 수 있고 동적으로 다양한 필드를 추가할 수 있기 때문)

HSET - hash에 아이템을 저장할 수 있고 한번에 여러 필드-값 쌍을 저장할 수 있음

ex) HSET Product:123 Name "Happy Hacking" TypeID 15 -> 결과 해당 키에 저장된 아이템 갯수를 리턴함

 

HGET - 지정한 키의 아이템 필드 값 조회

HMGET - 지정한 키의 아이템 필드들의 값 조회

HGETALL - 지정한 키의 모든 필드와 값 조회

 

Set - 정렬되지 않은 모든 문자열의 모임 (중복저장 X)

 

SADD - 하나 또는 여러개의 아이템을 한번에 저장

ex) SADD myset  A A A B D C-> A,B,D,C

SMEMBERS - 저장된 모든 아이템을 순서 관계없이 랜덤으로 모두 출력

SREM - 원하는 데이터 삭제

SPOP - 랜덤으로 하나의 아이템을 반환하면서 해당 아이템 삭제

SUNION - 합집합

SINTER - 교집합

SDIFF - 차집합

 

Sorted Set - 스코어 값에 따라 정렬되는 고유한 문자열의 집합

같은 스코어를 가진 아이템일 경우 데이터의 사전 순으로 정렬되어 저장됨

데이터 중복이 없고(Set), 스코어라는 데이터에 연결되는 점(Hash)에서 장점이 많은 자료구조임 

 

중요!

list, sorted set 모두 순서를 갖은 자료구조임으로 인텍스로 아이템에 접근이 가능함

하지만 list는 아이템 탐색 시 O(n)이고 sorted set은 O(log n)으로 훨씬 성능적으로 좋음 

 

ZADD - sorted set에 아이템을 저장할 수 있고 스코어-값 쌍으로 입력해야 됨 (한번에 여러 아이템을 입력할 수 있음)

ex) ZADD scored:220817 100 user:B -> 220817 - user(B) : 100 형태로 저장됨

- XX 옵션 : 아이템이 있는 경우에만 스코어 업뎃 

- NX 옵션 : 아이템이 없는 경우에만 신규 추가, 있는 경우 에러 반환

- LT 옵션 : 업뎃하고자 하는 스코어 < 기존 아이템의 스코어인 경우에만 업뎃 (없는 경우 단순 추가)

- GT 옵션 : 업뎃하고자 하는 스코어 > 기존 아이템의 스코어인 경우에만 업뎃 (없는 경우 단순 추가)

 

ZRANGE - 인덱스 범위의 데이터 조회 (start, stop 범위를 반드시 입력해야 됨)

- WITHSCORE 옵션 : 데이터와 함께 스코어 값 차례대로 출력

- REV 옵션 : 데이터 역순 출력

- BYSCORE 옵션 : 스코어를 이용한 데이터 조회

ex) ZRANGE score:220817 100 150 BYSCORE WITHSCORES -> 결과 : 키 220817 아이템 중 값이 100 ~150 사이의 아이템들

- ( 100 150으로 바꾸면 100 ~ 150 사이의 아이템 중 100은 제외하고 출력함

- -inf, +inf는 스코어의 최소/최대 값을 의미함

 

BYLEX 옵션 : 스코어가 동일한 경우 사전순으로 데이터 조회가 가능함 

- 문자열이 ASCII 바이트 값 기준으로 정렬하기 때문에 한글문자열도 사전적으로 정렬이 됨

Sset - 김치볶음밥, 납작만두, 도토리묵, 라면, 묵사발, 빈대떡, 삼겹살

ex) ZRANGE SSet (나 (바 BYLEX -> 결과 : 납작만두, 도토리묵, 라면, 묵사발

 

비트맵 - String 자료구조에 bit 연산을 수행할 수 있도록 확장된 형태임

가장 큰 장점은 저장공간을 획기적으로 줄일 수 있다는 점임

 

SETBIT - 비트로 저장

GETBIT - 저장된 비트 조회

BITFIELD - 여러 비트는 한번에 저장

BITCOUNT - 1로 저장된 비트의 개수 카운트

 

hyperloglog - 집합의 원수 개수인 카디널리티를 추정할 수 있는 자료구조 (오차 0.81%)

- set은 중복을 피하기 위해 데이터를 모두 저장하고 있어 메모리가 많이 필요하지만 hyperloglog는 저장되는 데이터 개수와 상관없이 일정한 메모리를 유지한다 그러면서 중복되지 않음

 

PFADD - 아이템 저장 

PFCOUNT - 저장된 아이템 개수 (= 카디널리티 추정)

 

Geospatial - 경도, 위도 데이터 쌍의 집합으로 간편하게 지리 데이터를 저장할 수 있는 방법임

내부적으로 sorted set으로 저장되며 하나의 자료구조 안에 키는 중복되지 않음

 

Stream - 메세지 브로커로 사용할 수 있게 하는 자료구조로 카프카처럼 소비자 그룹 개념을 통해 데이터를 분산 처리할 수 있음

(실시간 이벤트, 로그성 데이터 저장을 위해 사용함)

 

레디스에서 키를 관리하는 법 

키의 자동 생성과 삭제

Stream, set, sorted set, hash와 같이 하나의 키가 여러개의 데이터를 갖는 자료구조는 알아서 키가 생성/삭제되어야 됨

- 존재하지 않는 키로 데이터 입력하면 자동으로 키가 생성됨

- 특정 키의 모든 아이템을 삭제하면 자동으로 키가 삭제됨 

- 없는 키로 키 삭제/아이템 삭제/크기 조회와 같은 읽기 커맨드를 수행하면 에러 반환 대신에 키가 있으나 아이템이 없는 것처럼 동작함

 

키와 관련된 커맨드

키의 조회

EXISTS - 키가 존재하는지 확인 (있으면 1, 없으면 0)

KEYS - 저장된 모든 키를 조회 (레디스는 싱글 스레드임으로 동작하는 동안 행이 걸림으로 매우 주의해야 되는 커맨드임)

 -> h?llo - hello, hallo 매칭, h*llo - hllo, heeello 매칭, h[ea] - hello, hallo 매칭, h[^e]llo - hallo 매칭, hello 매칭되지 않음

 

SCAN - KEYS를 대체하는 키 조회 (한번에 모든 키를 반환하는 것이 아닌 커서를 기반으로 특정 범위의 키만 조회하는 방식임)

 -> SCAN 0부터 +1씩 호출해서 마지막에 출력되는 커서 값이 0이 반환되면 더이상 검색한 키 값이 없다는걸 의미함.

COUNT 옵션 - 반환하는 키의 개수는 기본값이 10이지만 이 반환 개수를 조정할 수 있음

(단, 레디스는 메모리를 체크해서 정의된 개수보다 몇개 더 읽는 것이 효율적이라면 1~2개 정도 더 반환할 수 있음)

MATCH 옵션 - 패턴에 맞는 키 조회

(단, 커서에 반환되는 키값을 기준으로 검색하기 때문에 한번에 원하는 키를 모두 볼 순 없음)

 

SCAN - KEYS 대체

SSCAN - SMEMBERS 대체

HSCAN - HGETALL 대체

ZSCAN - ZRANGE WITHSCORE 대체

 

SORT - list, set, sorted set에서만 사용가능한 커맨드로 키 내부의 아이템을 정렬해서 반환함

LIMIT 옵션 - 일부 데이터만 조회 (ASC/DESC 옵션으로 정렬 순서 정의)

(정렬할 대상이 문자열인 경우 ALPHA 옵션을 통해 사전 순으로 정렬 가능)

 - BY, GET 옵션을 이용해서 정렬한 결과를 이용해서 다른 키에 접근도 가능

 

RENAME- 키의 이름을 변경하는 커맨드 

COPY - 지정된 키와 데이터를 복사해서 새로운 키를 만듦 (새로운 키가 이미 있는 경우 에러가 반환되는데 REPLACE 옵션을 사용하면 기존 키를 삭제하고 새로 복사함)

TYPE - 지정한 키의 자료구조 반환

OBJECT - 키에 대한 상세정보 반환 (키가 얼마나 호출되지 않았는지도 확인 가능)

FLUSHALL - 저장된 모든 키 삭제 (Sync 방식으로 동작함으로 모든 데이터가 삭제된 경우에만 동작함, async 옵션을 사용하면 flush 되는 도중에 생성된 키를 삭제되지 않음)

DEL - 키와 키에 저장된 모든 데이터 삭제(동기식)

UNLINK - 키와 키에 저장된 모든 데이터 삭제(비동기식)

 

중요!!

set, sorted set처럼 하나의 키에 여러 아이템이 저장되는 자료구조인 경우 del을 수행하면 위험함

- 이유 : DEL은 동기 방식으로 동작함으로 해당 키에 저장된 모든 아이템이 삭제되는 동안 다른 커맨드를 수행할 수 없기 때문임 

(예를 들어 100만개의 아이템이 저장된 sorted set의 키를 DEL로 삭제하는 경우 FLUSHALL을 수행하는 것과 같음)

그러므로 DEL 보단 연결된 아이템의 링크를 끊는 UNLINK를 통해 데이터와 키를 삭제하는게 좋음.

 

키의 만료시간 

EXPIRE - 키 만료 시간을 초 단위로 정의할 수 있음 

NX 옵션 - 키에 만료 시간이 정의되어 있지 않는 경우에만 수행

XX 옵션 - 키에 만료 시간이 정의되어 있는 경우에만 수행 

GT 옵션 - 키가 갖고 있는 만료 시간보다 새로 입력한 초가 큰 경우에만 수행

LT 옵션 - 키가 갖고 있는 만료 시간보다 새로 입력한 초가 작은 경우에만 수행

 

TTL - 키가 몇초 뒤에 만료되는지 반환 (키가 없는 경우 -2, 키는 있지만 만료시간이 없는 경우 -1 반환)

 

 

[참고서적]

https://product.kyobobook.co.kr/detail/S000210785682

 

개발자를 위한 레디스 | 김가림 - 교보문고

개발자를 위한 레디스 | 개발자가 인메모리 데이터베이스인 레디스를 잘 활용할 수 있도록 초점을 맞춘 포괄적인 안내서다. 레디스를 처음 배우는 독자나 NoSQL 데이터베이스의 개념을 쌓고자 하

product.kyobobook.co.kr

 

반응형