Database/Redis

[실전 레디스] 2-1. 자료형과 기능: 기본 자료형

noahkim_ 2025. 3. 20. 00:51

하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.


1. 개요

네임스페이스

  • 기본적으로는 전역에서 키를 관리
  • 데이터베이스 번호로 구분 가능

 

키 어노테이션

  • 각 키간 관계를 정의하여 트리거를 구현할 수 있음

 

2. String

특징

  • 가장 간단한 타입 (key-value)
  • 이진 안전 문자열

 

용도

  • 문자열
  • 이진 데이터 (이미지, 실행파일 등) 용 
  • 숫자 (정수, 부동소수점 등)

 

활용

  • 카운터
  • 실시간 메트릭스
  • 캐시
    • 세션 / 쿠키
    • 이진 데이터

 

명령어

1개 등록 / 읽기
set foo bar
get foo

# 맨 뒤에 붙이기
append key value

# 길이 읽기
strlen key
getrange key 0 4

 

여러개 등록 / 읽기
mset mykey1 myvalue1 mykey2 myvalue2 mykey3 myvalue3
mget mykey1 mykey
  • 한번에 하는것이 효율적 
  • 하나씩 하는것은 RTT가 발생함 (Round Trip Time)

 

(숫자값) 정수 증가 / 감소
set hit_count 100
incr hit_count 
incrby hit_count 2 # 인수값만큼 증가
decr hit_count
decrby hit_count 2 # 인수값만큼 감소

 

(숫자값) 부동소수점 증가 / 감소
set real_number 1.5
incrbyfloat real_number 1.1
incrbyfloat real_number -1.1

 

활용

지정된 키가 존재하지 않을 때만 등록하기
mset user:2 "Suzuki Jiro" user:3 "Takahashi Saburo" user:4 "Tanaka Shiro" user:5 "Ito Goro"
set user:2 "Matanabe Rokuro" NX
set user:6 "Matanabe Rokuro" NX
get user:2 # Suzuki Jiro
get user:6 # Matanabe Rokuro
  • SET 명령어 옵션 사용
  • NX

 

TTL 설정
SETEX user:7 300 "Yamamoto Nanaro" # 해당 키의 TTL 시간 설정 (초)
TTL user:7 # 키의 남은 TTL 시간 확인

 

3. List

  • 문자열 컬렉션
  • 순서를 유지함

 

명령어

쓰기
lpush lkey lvalue1 lvalue2
rpush lkey lvalue1 lvalue2
linsert lkey before lvalue2 lvalue3
linsert lkey after lvalue1 lvalue0
  • 특정 원소 앞뒤로 삽입

 

lset lkey 0 first
  • 특정 원소 값 수정

 

꺼내기
lpop lkey
rpop lkey
lmpop 1 lkey LEFT COUNT 2  # 1개의 키에 대해 2개 lpop
lmpop 1 lkey RIGHT COUNT 2 # 1개의 키에 대해 2개 rpop
blmpop 10 1 lkey LEFT COUNT 2 # 1개의 키에 대해 2개 rpop 명령을 블로킹으로 수행
  • blmpop (블로킹 멀티 리스트 POP)
    • 여러 개의 리스트에서 요소를 블로킹 방식으로 가져옴
    • 리스트에 요소가 있으면, pop 명령 수행 후 종료
    • 리스트에 요소가 없으면, 지정된 시간 동안 블로킹하여 요소가 추가될 때까지 대기함
    • 블로킹 시간이 초과되면 nil을 반환

 

ltrim lkey 1 2    # 인덱스 1~2까지 남기기 (나머지 삭제)
ltrim lkey -2 -1  # 인덱스 -2~-1까지 남기기 (나머지 삭제)

 

삭제하기
lrem lkey 0 first # lkey에서 first 값 모두 삭제
lrem lkey 2 first # lkey에서 first 값 왼쪽에서 2개 삭제
lrem lkey -2 first # lkey에서 first 값 오른쪽에서 2개 삭제

 

확인하기
lindex lkey 0 # 왼쪽에서 인덱스 원소 값을 출력
llen lkey
lpos lkey lvalue1 # 값의 인덱스 반환
lpos lkey lvalue1 count 2 # 왼쪽에서 lvalue값 2개 찾아서 각각 인덱스 반환
lpos lkey lvalue1 rank 2 # 두번쨰 값 인덱스 반환
lpos lkey lvalue1 maxlen 4 # 4까지의 길이로 제한하여 탐색

 

활용

인기 콘텐츠 표시
  • RDBMS에서 가져온 10건의 최신 데이터를 레디스에 List 형으로 캐싱하고 언제든 반환할 수 있게 하는 방식
  • 최근 N개의 게시물 가져오기 (타임라인에 게시)

 

4. Hash

  • 순서 없이 필드와 값이 여러 쌍으로 매핑된 자료구조
  • 필드와 값의 타입은 모두 문자열

 

명령어

hset myhash field1 value1 field2 value2 field3 value3
hmset myhash field4 value4 field5 value5 field6 2 field7 1.3
hincrby myhash field6 1
hincrbyfloat myhash field7 1.3
hget myhash field3
hgetall myhash
hkeys myhash
hvals myhash
hlen myhash
hexists myhash field2

hscan myhash 0
hscan myhash 0 match *field*
hscan myhash 0 count 1
hdel myhash field3

 

주의사항

해시 요소의 개수가 많거나 최대 요소의 개수가 큰 경우
  • 요소의 개수가 큰 경우, 내부 인코딩을 활용한 메모리 압축을 사용하지 못함
  • 내부 인코딩 관련 매개변수 조정 필요

 

해시 전체 크기가 너무 큰 경우
  • 클러스터 사용 시, 샤드간 데이터 분산이 어려울 수 있음

 

HDEL 명령어 실행 시간
  • 필드가 많을 경우 조회 시간이 늘어나 HDEL 수행 시간이 늘어날 수 있음

 

활용

객체 스토리지
  • 상품 정보를 저장할 때 여러 속성이 있는 객체 스토리지를 저장할 때 유용 (상품 이름, 가격 등)

 

5. Set

  • 고유한 문자열 집합
  • 순서 없음

 

명령어

추가
sadd skey value1 value2 value3

 

제거
spop skey
srem skey value2
  • srem: 특정 원소 값으로 삭제

 

조회
sismember skey value4
smembers skey
scard skey
sscan skey 0
sscan skey 0 count 1
sscan skey 0 match *1

 

집합연산
sdiff skey skey2
sdiffstore skey31 skey skey2
sinter skey skey2
sinterstore skey32 skey2
sintercard 1 skey1
sunion skey31 skey32
sunionstore skey33 skey31 skey32
  • sdiffstore: destination 집합에 결과를 저장

 

활용

고유 사용자 수 조사
  • 특정 기간의 고유한 사용자 수를 조사하고자 할 때 활용함
  • 중복을 제외한 사용자의 집합을 관리할 수 잇음

 

6. Sorted Set

  • 순서가 있는 집합
  • 모든 요소에 점수열이란 값을 가짐 (부동소수점)
  • 요소들은 항상 점수값으로 정렬됨

 

명령어

추가
zadd rank:event:1 255547 Saburo
zadd rank:event:1 276302 Jiro
zadd rank:event:1 311121 Shiro
zadd rank:event:1 324891 Taro

 

삭제
zpopmax rank:event:1
zpopmin rank:event:1
zmpop 1 rank:event:1 min count 2
zmpop 1 rank:event:1 max count 3
zrem rank:event:1 Taro

 

조회
zcard rank:event:1
zrank rank:event:1 Saburo
zrevrank rank:event:1 Saburo
zrevrank rank:event:1 Jiro
zcount rank:event:1 200000 300000
zrange rank:event:1 0 1
zrevrange rank:event:1 0 1
zrangestore rank:event:1:low rank:event:1 0 1
zscore rank:event:1 Jiro
zmscore rank:event:1 Jiro Shiro
zscan rank:event:1 0

 

활용

실시간 랭킹
  • RDBMS에서 모델링할 때 성능 저하가 발생하기 쉬움
    • 정렬 유지
    • 실시간으로 지속 갱신