Redisのデータ構造を扱う
한국어 원문으로 표시합니다.
목표
Redis 의 여섯 자료구조를 각각 목적에 맞게 사용하고, 운영에서 절대 쓰면 안 되는 명령과 그 대안을 몸으로 익힌다.
왜 중요한가
Redis 를 String 하나로만 쓰는 코드는 어디에나 있습니다. 전부 JSON 으로 직렬화해 넣고 꺼냅니다. 동작은 하지만, 한 필드만 바꾸려 해도 전체를 읽고 파싱하고 다시 써야 하고, 동시에 두 요청이 그렇게 하면 한쪽이 조용히 덮어씁니다. Hash 를 쓰면 필드 하나만 원자적으로 바뀝니다. 자료구조 선택 하나가 경쟁 조건을 없애는 것입니다. 그리고 이 실습에서 반드시 몸에 남겨야 할 것이 하나 더 있습니다 — Redis 는 명령을 단일 스레드로 처리하므로 O(N) 명령 하나가 전면 정지를 만듭니다. 키가 수백만 개인 인스턴스에서 KEYS * 한 번이 수 초 동안 모든 요청을 멈춥니다. 7번 스텝의 SCAN 은 그래서 있습니다.
단계
redis-cli PING결과를/root/rd/ping.txt에 저장한다.app:hits를 3번 증가시킨다. 값이3이어야 한다.user:42해시에name,email,plan세 필드를 넣는다.HLEN user:42가 3 이다.feed:42리스트에 활동 12건을 넣고 최근 10건만 남기게 자른다.LLEN feed:42가 10 이다.tag:redis와tag:cache두 집합을 만들고 교집합을/root/rd/inter.txt에 저장한다. 교집합 원소가 2개여야 한다.score:game1정렬 집합에 멤버 5개를 점수와 함께 넣는다.ZCARD가 5 이고ZSCORE score:game1 p3가30이다./root/rd/scan.sh로user:*패턴 키를 SCAN 으로 전부 찾아/root/rd/scan.out에 적는다. 스크립트에KEYS문자열이 들어 있으면 안 된다./root/rd/mem.md에 마크다운 표를 만든다. 행 제목은string,hash,list,set,zset다섯 개이고bytes열에MEMORY USAGE결과를 적는다.
참고
- 리스트 자르기:
LTRIM feed:42 0 9 - 교집합:
SINTER tag:redis tag:cache - SCAN 루프: 커서 0 에서 시작해 반환된 커서가 0 이 될 때까지 반복
- 흔한 실수 1:
KEYS *를 쓰는 것 — 개발 장비에서는 빠르고 운영에서는 장애입니다. - 흔한 실수 2: 거대한 키를
DEL로 지우는 것 —UNLINK는 백그라운드에서 회수합니다.
연결 확인하기
redis-cli PING 결과를 /root/rd/ping.txt 에 저장한다.
redis-cli 는 인자 없이 실행하면 대화형입니다. 스크립트에서는 명령을 인자로 주는 편이 낫습니다.
String 으로 카운터 만들기
app:hits 를 3번 증가시킨다. 값이 3 이어야 한다.
증가 명령은 키가 없어도 0부터 시작합니다. 원자적이라는 점이 이 자료구조를 카운터로 만드는 이유입니다.
Hash 로 객체 저장하기
user:42 해시에 name, email, plan 세 필드를 넣는다. HLEN user:42 가 3 이다.
필드 단위로 넣고 꺼냅니다. JSON 을 통째로 넣는 것과 무엇이 다른지 생각해 보세요.
List 로 최근 활동 유지하기
feed:42 리스트에 활동 12건을 넣고 최근 10건만 남기게 자른다. LLEN feed:42 가 10 이다.
새 항목은 앞으로 넣고, 목록이 길어지지 않게 잘라 냅니다. 자르는 명령이 따로 있습니다.
Set 으로 태그 교집합 구하기
tag:redis 와 tag:cache 두 집합을 만들고 교집합을 /root/rd/inter.txt 에 저장한다. 교집합 원소가 2개여야 한다.
두 집합의 공통 원소를 구하는 명령이 있습니다. 애플리케이션에서 반복문으로 하면 안 됩니다.
ZSet 으로 점수 관리하기
score:game1 정렬 집합에 멤버 5개를 점수와 함께 넣는다. ZCARD 가 5 이고 ZSCORE score:game1 p3 가 30 이다.
점수와 멤버를 함께 넣습니다. 넣은 뒤 특정 멤버의 점수만 조회할 수 있습니다.
KEYS 대신 SCAN 으로 순회하기
/root/rd/scan.sh 로 user:* 패턴 키를 SCAN 으로 전부 찾아 /root/rd/scan.out 에 적는다. 스크립트에 KEYS 문자열이 들어 있으면 안 된다.
커서가 0으로 돌아올 때까지 반복합니다. 패턴 매칭 옵션도 있습니다.
자료구조별 메모리 비교표 만들기
/root/rd/mem.md 에 마크다운 표를 만든다. 행 제목은 string, hash, list, set, zset 다섯 개이고 bytes 열에 MEMORY USAGE 결과를 적는다.
같은 데이터를 다른 구조로 저장해 실제 사용량을 잽니다. 키별 사용량을 알려 주는 명령이 있습니다.