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
> ZRANGE leaderboard:455 0 2 REV WITHSCORES
1) "user:2"
2) "275"
3) "user:3"
4) "101"
5) "user:1"
6) "100"
> 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
> 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)
데이터 타입별 커맨드
https://redis.io/commands/
Commands
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker
redis.io