LabHub
배우기 러닝패스 코스

Redisとキャッシュ

Redisのデータ構造を扱う

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

Redis 의 여섯 자료구조를 각각 목적에 맞게 사용하고, 운영에서 절대 쓰면 안 되는 명령과 그 대안을 몸으로 익힌다.

왜 중요한가

Redis 를 String 하나로만 쓰는 코드는 어디에나 있습니다. 전부 JSON 으로 직렬화해 넣고 꺼냅니다. 동작은 하지만, 한 필드만 바꾸려 해도 전체를 읽고 파싱하고 다시 써야 하고, 동시에 두 요청이 그렇게 하면 한쪽이 조용히 덮어씁니다. Hash 를 쓰면 필드 하나만 원자적으로 바뀝니다. 자료구조 선택 하나가 경쟁 조건을 없애는 것입니다. 그리고 이 실습에서 반드시 몸에 남겨야 할 것이 하나 더 있습니다 — Redis 는 명령을 단일 스레드로 처리하므로 O(N) 명령 하나가 전면 정지를 만듭니다. 키가 수백만 개인 인스턴스에서 KEYS * 한 번이 수 초 동안 모든 요청을 멈춥니다. 7번 스텝의 SCAN 은 그래서 있습니다.

단계

  1. redis-cli PING 결과를 /root/rd/ping.txt 에 저장한다.
  2. app:hits 를 3번 증가시킨다. 값이 3 이어야 한다.
  3. user:42 해시에 name, email, plan 세 필드를 넣는다. HLEN user:42 가 3 이다.
  4. feed:42 리스트에 활동 12건을 넣고 최근 10건만 남기게 자른다. LLEN feed:42 가 10 이다.
  5. tag:redistag:cache 두 집합을 만들고 교집합을 /root/rd/inter.txt 에 저장한다. 교집합 원소가 2개여야 한다.
  6. score:game1 정렬 집합에 멤버 5개를 점수와 함께 넣는다. ZCARD 가 5 이고 ZSCORE score:game1 p330 이다.
  7. /root/rd/scan.shuser:* 패턴 키를 SCAN 으로 전부 찾아 /root/rd/scan.out 에 적는다. 스크립트에 KEYS 문자열이 들어 있으면 안 된다.
  8. /root/rd/mem.md 에 마크다운 표를 만든다. 행 제목은 string, hash, list, set, zset 다섯 개이고 bytes 열에 MEMORY USAGE 결과를 적는다.

참고

연결 확인하기

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:redistag:cache 두 집합을 만들고 교집합을 /root/rd/inter.txt 에 저장한다. 교집합 원소가 2개여야 한다.

두 집합의 공통 원소를 구하는 명령이 있습니다. 애플리케이션에서 반복문으로 하면 안 됩니다.

ZSet 으로 점수 관리하기

score:game1 정렬 집합에 멤버 5개를 점수와 함께 넣는다. ZCARD 가 5 이고 ZSCORE score:game1 p330 이다.

점수와 멤버를 함께 넣습니다. 넣은 뒤 특정 멤버의 점수만 조회할 수 있습니다.

KEYS 대신 SCAN 으로 순회하기

/root/rd/scan.shuser:* 패턴 키를 SCAN 으로 전부 찾아 /root/rd/scan.out 에 적는다. 스크립트에 KEYS 문자열이 들어 있으면 안 된다.

커서가 0으로 돌아올 때까지 반복합니다. 패턴 매칭 옵션도 있습니다.

자료구조별 메모리 비교표 만들기

/root/rd/mem.md 에 마크다운 표를 만든다. 행 제목은 string, hash, list, set, zset 다섯 개이고 bytes 열에 MEMORY USAGE 결과를 적는다.

같은 데이터를 다른 구조로 저장해 실제 사용량을 잽니다. 키별 사용량을 알려 주는 명령이 있습니다.