본문 바로가기
개발

Redis의 자료 구조 - Strings, Lists, Hashes, Sorted sets

by 상5c 2023. 3. 26.

 

들어가기 전..

이 글은 Redis 공식 문서 redisGate, 그리고 ChatGPT 답변을 참고하여 작성했습니다.

실습 환경 구성

Redis 서버는 Docker Redis를, 클라이언트는 DataGrip(유료)을 사용했습니다.

  • 다른 클라이언트로는 직접 CLI 환경에서 명령어를 사용하거나, (Mac의 경우) Redis GUI 클라이언트인 Medis 2를 App Store에서 다운로드하여 사용하는 방법이 있습니다.

Redis Container 실행하기

docker run -d -p 6379:6379 --name redis redis


Strings

  • 가장 기본적인 Redis 데이터 유형.
  • 키-밸류 형태로 데이터를 저장하며 캐싱, 카운터, 비트연산 등의 용도로 사용
  • 성능은 대부분 O(1)이나 SUBSTR, GETRANGE 같은 일부 명령어는 O(n)을 주의

명령어

GET

  • 검색(retrieve), 없으면 nil 반환
  • TMI: retrieve도 검색이고, search도 검색
    • retrieve: 저장 위치를 알고 있음. 특정 위치나 출처에서 정보 찾기.
    • search: 저장 위치를 모름. 위치나 출처가 불확실한 정보를 찾는 것.
  • GET hello

SET

  • 저장
  • SET hello world
    • hello에 world 저장

SETNX

  • 키가 없을 때만 문자열 저장. 성공/실패 결과를 반환
  • 한 번만 저장하기에 잠금(lock) 구현시 사용
  • SETNX hello world
    • hello에 world 저장, 성공시 true 반환

MGET

  • 한 번에 여러 문자열 검색
  • MGET str1 str2

INCR

  • 1씩 증가하는 카운터, 원자 단위동작
  • 음수 전달시 감소
  • INCR name
    • name의 value가 1씩 증가한다

INCRBY

  • n씩 증가하는 카운터
  • 값이 없으면 새로 만든다
  • INCRBY name 1
    • name의 value가 마지막 파라미터만큼 증가한다

Lists

  • 문자열 값들이 연결된 리스트(linked list)
  • 스택, 큐 구현시 사용
  • 연결 리스트(Linked list)이기 때문에 순서가 있고 장/단점이 같다
  • 왼쪽(앞)을 head, 오른쪽(끝)을 tail이라고 표현. head와 tail과 관련된 액세스에서는 시간 복잡도가 O(1)이나, 리스트 내의 요소 조작시 일반적으로 O(n)

명령어

LPUSH, RPUSH

  • head/tail에 값을 추가

LPOP / RPOP

  • head/tail 값을 제거

LLEN

  • 리스트 길이 반환

LMOVE

  • 다른 리스트로 요소를 이동
  • LMOVE board:todo:ids board:in-progress:ids LEFT LEFT

LTRIM

  • 지정한 갯수만큼 남기고 버리기
  • LTRIM key 0 9
    • 인덱스는 0부터 시작하며 초과한 값을 버립니다(11번째부터 없어짐)

LRANGE

  • 지정한 갯수만큼 리턴
  • POP 명령어와 달리 없어지지 않고 단순 조회
  • LRAGNE key 0 3
    • 0부터 3번 인덱스까지 반환

Hashes

  • 필드-밸류 쌍의 집합
  • “키”는 전역 식별자로 사용되며 해시의 “키-밸류”를 전역 식별자와 구분하기 위해 “필드-밸류”라고 표현
  • 대부분 명령의 경우 O(1)의 시간 복잡도를 가지나 HKEYS, HVALS, HGETALL 같은 전체를 읽는 일부 명령어의 경우 O(n)

명령어

HSET / HGET

  • 저장 / 조회
  • HSET hello f1 vv f2 bb
    • hello 키에 f1=vv, f2=bb 값을 저장하는 명령이며 한 번에 여러 값을 저장 가능하다

HMGET

  • 여러 값 조회
  • HMGET hello f1 f2

HINCRBY

  • n씩 증가하는 카운터 (INCRBY와 비슷하다)
  • 카운터를 전달한 값만큼 증가시킨다.
  • HINCRBY hello cnt 3

Sorted Sets

  • 점수에 따라 정렬된 유니크한 문자열 집합
  • 점수(score)와 값을 갖는다
  • 다른 설정을 전달하지 않고 조회하면 점수 오름차순, 값 사전순 정렬

명령어

ZADD

  • 점수와 값 추가
  • 값이 존재하면 점수 업데이트
ZADD leaderboard:455 100 user:1 # user:1 100
ZADD leaderboard:455 100 user:2 # user:2 100
ZADD leaderboard:455 100 aser:1 # aser:1 100
ZADD leaderboard:455 101 aser:1 # aser:1 101 (업데이트)

ZRANGE

  • 일정 범위의 값을 가져온다. 
  • 범위는 0부터 시작한다.
ZRANGE leaderboard:455 0 2 REV WITHSCORES # 0번부터 2번까지 스코어와 함께 역순 조회
  • 대규모 트래픽을 받을 때 해당 기능을 사용하여 TPS를 조절할 수 있다.

ZRANK & ZREVRANK

  • 해당 값의 순위를 가져온다
  • REV가 붙으면 역순이다.
  • 순위는 0부터 시작한다.
ZRANK leaderboard:455 user:2 # user:2의 순위는 1이다.