들어가기 전..
이 글은 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이다.