본문 바로가기

독서/개발자를 위한 레디스

[개발자를 위한 레디스] 3장 레디스 기본 개념

반응형
SMALL

레디스의 자료 구조

string

  • 최대 512MB의 문자열 데이터를 저장할 수 있다.
  • 키와 실제 저장되는 아이템이 일대일로 연결되는 유일한 자료 구조이다.

 

NX 옵션을 사용하면 지정한 키가 없을 때에만 새로운 키를 저장한다.

 

XX 옵션을 사용하면 반대로 키가 이미 있을 때에만 새로운 값으로 덮어 쓰며 새로운 키를 생성하진 않도록 동작한다.

 

숫자 형태로도 저장할 수 있다.

  • INCR, INCRBY와 같은 커맨드 데이터를 원자적으로 처리한다. (동시성 이슈X)
  • INCR: 저장한 데이터를 1씩 증가시킨다.
  • INCRBY: 입력한 값만큼 데이터를 증가시킨다.

 

MSET, MGET 커맨드를 이용하여 한 번에 여러 키를 조작할 수 있다.

  • 위 커맨드를 적절하게 사용해 네트워크 통신 시간을 줄일 수 있다.

 

 

list

  • 순서를 가지는 문자열의 목록이다.
  • 하나의 list에 최대 42억여 개의 아이템을 저장할 수 있다.
  • 일반적으로 서비스에서 스택과 큐로서 사용된다.

 

  • LPUSH: list의 왼쪽에 데이터를 추가한다.
  • RPUSH: list의 오른쪽에 데이터를 추가한다.
  • LRANGE: list에 들어 있는 데이터를 조회한다.

 

 

LTRIM: 시작과 끝 아이템의 인덱스를 인자로 전달받아 지정한 범위에 속하지 않은 아이템을 전부 삭제한다. (반환X)

 

  • list에 로그를 저장할 수 있다.
    • 로그는 주기적으로 삭제해 저장 공간을 확보하는 것이 일반적이다.
    • 최대 1000개의 로그 데이터를 보관하고 싶다면, 데이터를 저장할 때 LPUSH와 LTRIM 커맨드를 함께 사용할 수 있다.
LPUSH logdata <data>
LTRIM logdata 0 999

++ 데이터의 개수가 1001개가 되기 전까지는 LTRIM 커맨드 동작이 일어나지 않는다.

 

  • LINSERT: 데이터를 삽입한다.
  • BEFORE 옵션: 원하는 데이터 앞에 삽입한다.

 

LSET: 지정한 인덱스의 데이터를 신규 입력하는 데이터로 덮어 쓴다.

 

LINDEX: 원하는 인덱스의 데이터를 확인할 수 있다.

 

 

hash

  • 필드-값 쌍을 가진 아이템의 집합
  • 각 아이템마다 다른 필드를 가질 수 있으며, 동적으로 다양한 필드를 추가할 수 있다.

 

HSET: hash에 아이템을 저장할 수 있으며, 한 번에 여러 필드-값 쌍을 저장할 수 있다.

 

  • HGET: hash에 저장된 데이터를 가져올 수 있다.
  • HMGET: 하나의 hash 내에서 다양한 필드의 값을 가져올 수 있다.
  • HGETALL: hash 내의 모든 필드-값 쌍을 차례로 반환한다.

 

 

Set

  • 정렬되지 않은 문자열의 모음
  • 객체 간의 관계를 계산하거나 유일한 원소를 구해야 할 경우 사용된다.

 

  • SADD: 아이템 저장
  • SMEMBERS: set 자료 구조에 저장된 전체 아이템 출력 (랜덤한 순서로 출력)

 

  • SREM: 원하는 데이터 삭제
  • SPOP: 랜덤으로 데이터 삭제 후 반환

 

  • SINTER: 교집합 계산
  • SUNION: 합집합 계산
  • SDIFF: 차집합 계산

 

 

sorted Set

  • 스코어 값에 따라 정렬되는 고유한 문자열의 집합
  • 저장될 때부터 스코어 값으로 정렬돼 저장된다.
  • 같은 스코어를 가진 아이템은 데이터의 사전 순으로 정렬돼 저장된다.

 

ZADD: sorted set에 아이템 저장 (스코어-값 쌍으로 입력)

  • XX 옵션: 아이템이 이미 존재할 때에만 스코어 업데이트
  • NX 옵션: 아이템이 존재하지 않을 때에만 신규 삽입
  • LT 옵션: 업데이트하고자 하는 스코어가 기존 아이템의 스코어보다 작을 때에만 업데이트
  • GT 옵션: 업데이트하고자 하는 스코어가 기존 아이템의 스코어보다 클 때에만 업데이트

 

ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

ZRANGE: sorted set에 저장된 데이터를 조회할 수 있다. (범위 입력 필요)

 

 

인덱스로 데이터 조회

  • WITHSCORES: 스코어와 함께 조회
  • REV: 역순으로 조회

 

 

스코어로 데이터 조회

BYSCORE 옵션을 사용하면 스코어를 이용해 데이터를 조회할 수 있다.

 

인수로 전달하는 스코어에 ( 문자를 추가하면 해당 스코어를 포함하지 않는 값만 조회할 수 있다.

 

+inf 를 사용하여 입력한 스코어 값(200)보다 큰 모든 값을 출력한다.

 

역순으로 조회하기 위해서 최솟값과 최대값 스코어의 전달 순서를 변경한다.

 

 

사전 순으로 데이터 조회

스코어가 같을 때 BYLEX 옵션을 사용하여 사전식 순서를 이용해 특정 아이템을 조회할 수 있다.

 

 

비트맵

  • string 자료 구조에 bit 연산을 수행할 수 있도록 확장한 형태
  • 저장 공간을 획기적으로 줄일 수 있다.

 

  • SETBIT: 비트 저장
  • GETBIT: 저장된 비트 조회
  • BITFIELD: 한 번에 여러 비트를 SET

 

 

Hyperloglog

  • 집합의 원소 개수인 카디널리티를 추정할 수 있는 자료 구조
  • 대량 데이터에서 중복되지 않는 고유한 값을 집계할 때 유용하게 사용할 수 있는 데이터 구조
  • 입력되는 데이터 그 자체를 저장하지 않고 자체적인 방법으로 데이터를 변경해 처리한다.
  • 하나의 hyperloglog 자료 구조는 최대 12KB의 크기를 가지며, 레디스에서 카디널리티 추정의 오차는 0.81%로, 비교적 정확하게 데이터를 추정할 수 있다.

 

  • PFADD: hyperloglog에 아이템 저장
  • PFCOUNT: 저장된 아이템의 개수 추정

 

 

Geospatial

  • 경도, 위도 데이터 쌍의 집합으로 간편하게 지리 데이터를 저장할 수 있는 방법
  • 내부적으로 데이터는 sorted set으로 저장되며, 하나의 자료 구조 안에 키는 중복돼 저장되지 않는다.

 

GEOADD: <key> 경도 위도 member 순서로 저장

 

  • GEOPOS: 저장된 위치 데이터 조회
  • GEODIST: 두 아이템 사이의 거리 반환
  • GEOSEARCH: 특정 위치를 기준으로 원하는 거리 내에 있는 아이템 검색
    • BYRADIUS 옵션: 반경 거리 기준
    • BYBOX 옵션: 직사각형 거리 기준

 

 

stream

  • 레디스를 메시지 브로커로서 사용할 수 있게 하는 자료 구조
  • 카프카처럼 소비자 그룹 개념을 도입해 데이터 분산 처리 가능
  • 데이터를 계속해서 추가하는 방식으로 저장하므로, 실시간 이벤트 또는 로그성 데이터의 저장을 위해 사용 가능

 


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

키의 자동 생성과 삭제

1. 키가 존재하지 않을 때 아이템을 넣으면 아이템을 삽입하기 위해 빈 자료 구조를 생성한다.

 

2. 모든 아이템을 삭제하면 키도 자동으로 삭제된다. (stream 예외)

 

3. 키가 없는 상태에서 키 삭제, 아이템 삭제, 자료 구조 크기 조회 같은 읽기 전용 커맨드를 수행하면 에러를 반환하는 대신 키가 있으나 아이템이 없는 것처럼 동작한다.

 

 

키와 관련된 커맨드

자료 구조에 상관없이 모든 키에 공통적으로 사용할 수 있는 커맨드에 대해 알아본다.

 

  • 키의 조회
    • EXISTS: 키가 존재하는지 확인하는 커맨드 (존재하면 1, 없으면 0 반환)
    • KEYS: 레디스에 저장된 모든 키를 조회하는 커맨드 (패턴에 해당하는 모든 키 반환)
      • h?llo: hello, hallo 가능
      • h*llo: hllo, heeeello 가능
      • h[ae]llo: hello, hallo만 가능
      • h[^e]llo: hallo, hbllo 가능 (e 제외)
      • h[a-b]llo: hallo부터 hbllo만 가능
    • SCAN: KEYS를 대체해 키를 조회할 때 사용할 수 있는 커맨드 (커서 기반으로 특정 범위의 키만 조회 가능)
      • 비슷한 커맨드: SSCAN, HSCAN, ZSCAN (각각 set, hash, sorted set에서 아이템을 반복 호출하여 조회 가능)
    • SORT: 키 내부의 아이템을 정렬해 반환하는 커맨드
      • list, set, sorted set에서만 사용 가능
      • 정렬 대상이 문자열일 경우 ALPHA 옵션 사용 필요
    • RENAME/RENAMENX: 키의 이름을 변경하는 커맨드
    • COPY: source에 지정된 키를 destination 키에 복사하는 커맨드
    • TYPE: 지정한 키의 자료 구조 타입을 반환하는 커맨드
    • OBJECT: 키에 대한 상세 정보를 반환하는 커맨드
  • 키의 삭제
    • FLUSHALL: 레디스에 저장된 모든 키를 삭제하는 커맨드
    • DEL: 키와 키에 저장된 모든 아이템을 삭제하는 커맨드 (동기)
    • UNLINK: 키와 데이터를 삭제하는 커맨드 (백그라운드 실행, 우선 키와 연결된 데이터의 연결을 끊음)
  • 키의 만료 시간
    • EXPIRE: 키가 만료될 시간을 초 단위로 정의할 수 있다.
      • NX 옵션: 해당 키에 만료 시간이 정의돼 있지 않을 경우에만 커맨드 수행
      • XX 옵션: 해당 키에 만료 시간이 정의돼 있을 때에만 커맨드 수행
      • GT 옵션: 현재 키가 가지고 있는 만료 시간보다 새로 입력한 초가 더 클 때에만 수행
      • LT 옵션: 현재 키가 가지고 있는 만료 시간보다 새로 입력한 초가 더 작을 때에만 수행
    • EXPIREAT: 키가 특정 유닉스 타임스탬프에 만료될 수 있도록 키의 만료 시간을 직접 지정한다.
    • EXPIRETIME: 키가 삭제되는 유닉스 타임스탬프를 초 단위로 반환한다.
    • TTL: 키가 몇 초 뒤에 만료되는지 반환한다.

 


References

개발자를 위한 레디스 3장

반응형
LIST