Redis는 다양한 데이터 타입과 데이터 타입별 커맨드를 제공합니다.
Key 설정 포인트
- Key는 문자열이므로 최대 512MB까지 가능
- 길이 등 가독성을 고려해야하고, 스키마를 유지할 수 있도록 설계할 것
- ex) user:1000:followers
Strings
가장 기본적인 Redis 데이터 유형
텍스트, 직렬화된 개체 및 이진 배열을 포함한 바이트 시퀀스를 저장, 이미지 저장 가능
캐싱에 자주 사용되지만 카운터를 구현하고, 비트 연산을 수행할 수 있는 기능도 제공
단일 문자열은 최대 512MB
예
- 문자열 저장하고 검색
> SET user:1 minju
OK
> GET user:1
"minju"
- 직렬화된 JSON 문자열 저장하고 지금부터 100초 후에 만료되도록 설정
> SET ticket:27 "\"{'username': 'minju', 'ticket_id': 321}\"" EX 100
- 카운터 증가
> INCR views:page:2
(integer) 1
> INCRBY views:page:2 10
(integer) 11
Bitmaps
String의 확장, bit 단위 연산
데이터 저장공간 절약
정수로 된 데이터만 카운팅 가능
데이터 on/off 가능 - SETBIT
- 하루 총 방문자 수 세기
Lists
문자열의 목록
Linked List와 같은 형태, 스택과 큐 형태 구현
백그라운드 시스템을 위한 대기열 관리 구축
Blocking 기능을 이용해 Event Queue로 사용
- 트위터 피드 기능
- 키가 있을 때만 데이터 저장 가능 - LPUSHX / RPUSHX : 이미 캐싱되어 있는 피드에만 신규 트윗을 저장해서 자주 사용하는 유저에게만 데이터를 넣어줄 수 있음
예
- 리스트를 대기열처럼 취급(선입선출)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> RPOP work:queue:ids
"101"
> RPOP work:queue:ids
"237"
- 리스트를 스택처럼 취급(선입, 후출)
> LPUSH work:queue:ids 101
(integer) 1
> LPUSH work:queue:ids 237
(integer) 2
> LPOP work:queue:ids
"237"
> LPOP work:queue:ids
"101"
- 리스트 길이 조회
> LLEN work:queue:ids
(integer) 0
- 한 리스트에서 요소를 atomic하게 pop하고 다른 목록으로 push
> LPUSH board:todo:ids 101
(integer) 1
> LPUSH board:todo:ids 273
(integer) 2
> LMOVE board:todo:ids board:in-progress:ids LEFT LEFT
"273"
> LRANGE board:todo:ids 0 -1
1) "101"
> LRANGE board:in-progress:ids 0 -1
1) "273"
- 100개를 초과하지 않는 리스트를 만들려면 다음을 호출할 때마다(LTRIM) 호출(LPUSH)
> LPUSH notifications:user:1 "You've got mail!"
(integer) 1
> LTRIM notifications:user:1 0 99
OK
> LPUSH notifications:user:1 "Your package will be delivered at 12:01 today."
(integer) 2
> LTRIM notifications:user:1 0 99
OK
Hashes
하나의 key 안에 여러 개의 field-value 쌍의 컬렉션
field = subkey, field 개수는 제한 없음
기본 객체를 나타내고 카운터를 그룹화하여 저장
예
- 기본 사용자 프로필을 해시로 나타냄
> HSET username:123 username minju firstName Minju lastName Jeon country KR
(integer) 4
> HGET user:123 username
"minju"
> HGETALL user:123
1) "username"
2) "minju"
3) "firstName"
4) "Minju"
5) "lastName"
6) "Jeon"
7) "country"
8) "KR"
- 장치 777이 서버에 핑을 보내거나, 요청을 발행하거나, 오류 보낸 횟수에 대한 카운터 저장
> HINCRBY device:777:stats pings 1
(integer) 1
> HINCRBY device:777:stats pings 1
(integer) 2
> HINCRBY device:777:stats pings 1
(integer) 3
> HINCRBY device:777:stats errors 1
(integer) 1
> HINCRBY device:777:stats requests 1
(integer) 1
> HGET device:777:stats pings
"3"
> HMGET device:777:stats requests errors
1) "1"
2) "1"
Sets
고유한 문자열, 중복 X, 정렬X → 집합
고유한 항목 추적(예: 지정된 블로그 게시물에 액세스하는 모든 고유한 IP 주소 추적)
관계 나타내기(예: 주어진 역할을 가진 모든 사용자 집합)
교집합, 합집합 등 일반적인 집합 연산 수행
예
- 사용자 123 및 456의 즐겨찾는 책 ID set 저장
> SADD user:123:favorites 347
(integer) 1
> SADD user:123:favorites 561
(integer) 1
> SADD user:123:favorites 742
(integer) 1
> SADD user:456:favorites 561
(integer) 1
- 사용자 123이 책 742와 299를 좋아하는지 조회
> SISMEMBER user:123:favorites 742
(integer) 1
> SISMEMBER user:123:favorites 299
(integer) 0
- 사용자 123과 456이 공통적으로 좋아하는 책 조회
> SINTER user:123:favorites user:456:favorites
1) "561"
- 사용자 123이 좋아하는 책이 몇 권인지 조회
> SCARD user:123:favorites
(integer) 3
Sorted Sets
정렬된 고유한 문자열 set
key, value에서 score까지 함께 저장 → 둘 이상의 score 값이 동일할 경우 사전순 정렬
- 순위표. 예를 들어 대규모 온라인 게임에서 가장 높은 점수의 정렬된 목록을 쉽게 유지 관리
- 속도 제한기. 과도한 API 요청을 방지하기 위해 슬라이딩 윈도우 속도 제한기 구축
예
- 플레이어의 점수가 변경되면 실시간 순위표 업데이트
> ZADD leaderboard:455 100 user:1
(integer) 1
> ZADD leaderboard:455 75 user:2
(integer) 1
> ZADD leaderboard:455 101 user:3
(integer) 1
> ZADD leaderboard:455 15 user:4
(integer) 1
> ZADD leaderboard:455 275 user:2
(integer) 0
- 상위 3명의 플레이어 점수 조회
> ZRANGE leaderboard:455 0 2 REV WITHSCORES
1) "user:2"
2) "275"
3) "user:3"
4) "101"
5) "user:1"
6) "100"
- 사용자 2의 등급 조회
> ZREVRANK leaderboard:455 user:2
(integer) 0
HyperLogLogs(HLL)
2007년 Philippe Flajolet이 발표한 알고리즘
시간복잡도 O(1)로 효율적인 공간 활용을 위해 unique count를 통한 완벽한 정확도 제공, set의 카디널리티를 구하는데 주로 사용됨
확률적 자료구조를 이용한 추정 원리 : https://d2.naver.com/helloworld/711301
최대 12KB를 사용하고 0.81%의 오류 제공
count만 셀뿐이어서 value는 저장하지 않음 (내부 데이터 확인 불가능)
AWS 엘라스틱캐시, 클라우드 미터링(돈을 매기는 지표)
예
- 몇 가지 항목 추가
> PFADD members 123
(integer) 1
> PFADD members 500
(integer) 1
> PFADD members 12
(integer) 1
- set의 구성원 수 추정
> PFCOUNT members
(integer) 3
Streams
신규 기능
append-only 로그, 로그를 저장하기에 최적의 자료구조
메시지 브로커로 특화
실시간으로 이벤트를 기록하고 동시에 syndicate 한다. (일괄적으로 ..??)
kafka에서 영향을 받음
- 이벤트 소싱(예: 사용자 작업, 클릭 추적 등)
- 센서 모니터링(예: 현장 장치의 판독값)
- 알림(예: 각 사용자의 알림 기록을 별도의 스트림에 저장)
각 스트림 항목에 대해 고유한 ID를 생성 → 나중에 연결된 항목을 검색하거나 후속 항목 처리
여러 트리밍 전략(스트림이 무제한으로 커지는 것을 방지)과 둘 이상의 소비 전략(XREAD, XREADGROUP, 과 XRANGE)을 지원
예
- 스트림에 여러 온도 판독값 추가
> XADD temperatures:us-ny:10007 * temp_f 87.2 pressure 29.69 humidity 46
"1658354918398-0"
> XADD temperatures:us-ny:10007 * temp_f 83.1 pressure 29.21 humidity 46.5
"1658354934941-0"
> XADD temperatures:us-ny:10007 * temp_f 81.9 pressure 28.37 humidity 43.7
"1658354957524-0"
- ID에서 시작하는 처음 두 개의 스트림 항목 조회
> XRANGE temperatures:us-ny:10007 1658354934941-0 + COUNT 2
1) 1) "1658354934941-0"
2) 1) "temp_f"
2) "83.1"
3) "pressure"
4) "29.21"
5) "humidity"
6) "46.5"
2) 1) "1658354957524-0"
2) 1) "temp_f"
2) "81.9"
3) "pressure"
4) "28.37"
5) "humidity"
6) "43.7"
- 스트림의 끝에서 시작해서 최대 100개의 새 스트림을 읽고 항목이 기록되지 않는 경우 최대 300ms 동안 차단
> XREAD COUNT 100 BLOCK 300 STREAMS temperatures:us-ny:10007 $
(nil)
데이터 타입별 커맨드
Commands
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker
redis.io