하야시 쇼고 님의 "실전 레디스" 책을 정리한 포스팅 입니다.
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에서 모델링할 때 성능 저하가 발생하기 쉬움
- 정렬 유지
- 실시간으로 지속 갱신
'Database > Redis' 카테고리의 다른 글
[실전 레디스] 2-4. 자료형과 기능: 공통 명령어 (0) | 2025.03.21 |
---|---|
[실전 레디스] 2-3. 자료형과 기능: 보조 기능 (0) | 2025.03.21 |
[실전 레디스] 2-2. 자료형과 기능: 보조 자료형 (0) | 2025.03.20 |
[실전 레디스] 1. 레디스의 시작 (0) | 2025.03.19 |
[Redis] 2. Understanding Data Types (0) | 2024.09.05 |