소개
작은 매장은 준비된 기본 데이터베이스에 기준 가격을 보관하고, 고객이 이미 조회한 가격을 Redis에 기억합니다. 반복 조회는 기억된 값을 사용해야 합니다. 그러나 하나의 SKU도 매장이나 통화가 다르면 가격이 다를 수 있으며, 기억된 가격은 언젠가 만료되어야 합니다.
완전한 캐시 식별 정보를 선택하고 매번 캐시를 채울 때 유한한 수명을 부여하는 짧은 policy.py를 완성합니다. 기본적인 터미널 탐색과 Redis GET/SET 지식이 필요합니다. Python 템플릿과 변경할 모든 표현식은 여기서 설명하므로 이전 Python 과정은 필요하지 않습니다. 기본 데이터베이스는 준비된 SQLite이며 두 번째 데이터베이스를 구현하는 작업이 아닙니다. 이 독립 단원은 자체 새 데이터와 Terminal만 사용합니다.
/home/labex/project/cache-desk/policy.py만 편집하세요. 제공된 도구, 원본 테이블, 모든 원본 식별 정보와 가격, 무관한 카탈로그 메모를 유지하세요. 세 함수 안에서는 문서화된 원본/캐시 API와 일반적인 정책 표현식만 사용하세요. import, 셸 실행, 무관한 자원은 정책에 넣지 마세요. 캐싱을 끄거나, Redis를 광범위하게 비우거나, 전역 설정을 바꾸지 마세요. 통제된 순차 요청을 시험하며 운영 지연 시간이나 강한 일관성을 보장하지 않습니다. 저자의 예상 시간에는 읽기와 일반적인 실수가 포함되며 초보자를 대상으로 시간을 측정하지 않았습니다.
고객이 실제로 요청하는 가격 구분하기
이 단계에서는 실제 캐시 적중을 관찰하고 키 충돌을 찾은 뒤 각 가격의 완전한 식별 정보를 키에 넣습니다.
셸 프롬프트의 Terminal에서 시작하세요. cd는 현재 디렉터리를 변경하며 이 절대 경로는 어느 디렉터리에서나 동작합니다. ./desk는 해당 디렉터리의 준비된 프로그램을 실행합니다. 아래 각 명령은 별도의 셸 명령이며 대화형 Redis 프롬프트에 넣는 입력이 아닙니다.
cd /home/labex/project/cache-desk
./desk status
열 순서 shop / sku / currency / integer cents를 읽으세요. North MUG USD는 1200센트, South MUG USD는 1500, North MUG EUR는 1100, North FREE USD는 0입니다. 상태 표시는 기준 가격을 읽으며 캐시를 채우지 않습니다.
캐시 미스는 요청한 키에 Redis 값이 없다는 뜻입니다. 캐시 적중은 값이 있다는 뜻입니다. 준비된 애플리케이션은 cache-aside를 사용합니다. Redis를 먼저 읽고 미스일 때만 기본 데이터베이스를 읽은 뒤 결과를 기억합니다. 같은 정상 요청을 두 번 시도하세요:
./desk view north MUG USD
./desk view north MUG USD
첫 결과에는 "cents": 1200, "origin": "source", "primary_selects": 1이, 두 번째에는 "origin": "cache", "primary_selects": 0이 보여야 합니다. 횟수는 추정 속도 향상이 아니라 이 요청의 SQLite 자체 SELECT 추적에서 나옵니다. JSON 출력의 필드 이름은 따옴표로 감싸져 있으며 이 세 필드는 가격, 출처, 기본 데이터베이스 읽기를 나타냅니다.
이제 다른 매장을 요청하고 실제 Redis 키를 확인하세요:
./desk view south MUG USD
./desk inspect south MUG USD
./desk policy
불완전한 키는 MUG만 사용합니다. 기본 데이터베이스에 여전히 1500이 저장되어 있어도 South에 North의 1200을 반환할 수 있습니다. inspect는 키와 실제 값을 읽으며 가격을 고치지 않습니다. 제공된 접두부 catalog는 이 과정의 키 범위를 정합니다. 모든 키는 catalog:처럼 제공된 접두부 다음에 콜론이 오는 형태로 시작해야 합니다. 접미부는 SKU만이 아니라 세 식별 필드를 모두 구분해야 하며 동등한 접미부 인코딩도 허용됩니다.
템플릿은 Python입니다. def는 함수를 정의하며 괄호 안의 이름은 인수입니다. 들여쓴 본문은 해당 함수에 속합니다. return은 결과를 제공합니다. identity는 표시된 필드 순서의 항목 세 개짜리 튜플입니다. identity[0]은 매장, [1]은 SKU, [2]는 통화입니다. 인덱스는 0부터 시작합니다. f"...{name}..."은 표현식을 문자열에 넣으며 여기서 콜론은 일반 구분자입니다. 과정의 식별자는 문자, 숫자, 하이픈, 밑줄만 포함하므로 그 구분자를 포함할 수 없습니다. 이 키 형식은 임의의 사용자 텍스트를 위한 일반 인코딩은 아닙니다.
read_price에서 =는 값을 대입합니다. cache.command("GET", key)는 실제 Redis 명령을 보냅니다. None은 캐시 값이 없음을 뜻하며 if value is not None:은 값이 있을 때만 분기합니다. 이 명시적 검사가 가격 0을 보존합니다. Redis는 문자열 값을 반환하므로 int(value)가 정수 센트로 변환합니다. return cents, "source"의 쉼표는 쌍을 반환합니다. source.read(identity)는 준비된 기본 데이터베이스 SELECT를 실행하고 알 수 없는 식별 정보에는 조회 오류를 일으킵니다. 대신 사용할 기준 가격은 없습니다.
완전한 키를 사용하는 전체 파일을 저장하세요. cat > policy.py는 파일을 덮어씁니다. 따옴표로 지정한 here-document 표시 'POLICY'는 셸이 뒤의 모든 줄을 단독 POLICY 줄까지 그대로 복사하게 합니다. 공백 네 개의 들여쓰기를 유지하며 전체 블록을 복사하세요. 반복되는 함수는 준비된 읽기 동작을 유지하며 이 단계에서는 키 결정만 바뀝니다.
cat > policy.py <<'POLICY'
def cache_key(prefix, identity):
return f"{prefix}:{identity[0]}:{identity[1]}:{identity[2]}"
def read_price(source, cache, prefix, identity):
key = cache_key(prefix, identity)
value = cache.command("GET", key)
if value is not None:
return int(value), "cache"
cents = source.read(identity)
cache.command("SET", key, cents)
return cents, "source"
def change_price(source, cache, prefix, identity, cents):
source.write(identity, cents)
POLICY
각 식별 조합을 두 번씩 조회하세요:
./desk view north MUG USD
./desk view north MUG USD
./desk view south MUG USD
./desk view south MUG USD
./desk view north MUG EUR
./desk view north MUG EUR
./desk view north FREE USD
./desk view north FREE USD
새 완전한 키의 첫 읽기는 원본에서, 두 번째는 Redis에서 나옵니다. 가격은 각각 1200, 1500, 1100, 0입니다. 잘못된 가격의 캐시 적중은 성공이 아닙니다. 이전의 폐기 가능한 catalog:MUG 키는 더 이상 사용하지 않으며 광범위한 삭제는 필요하지 않습니다.
./deskk를 입력하면 셸은 파일이 없다고 보고합니다. ls는 실제 도구를 나열합니다. 올바른 철자로 ./desk를 다시 실행하세요. Python이 구문이나 들여쓰기 오류를 보고하면 ./desk policy로 표시한 뒤 앞 공백을 유지하며 전체 파일 블록을 다시 복사하세요. VM을 초기화하거나 준비된 도구를 바꾸지 마세요. 이 단계 검사는 사용 후 버릴 테스트 환경에서 다른 식별 정보를 시험하고 실제 기본 데이터베이스는 보존하며 특정 키 표기를 요구하지 않습니다.
캐시를 채울 때 만료 시한 부여하기
이 단계에서는 가격이 Redis에 들어올 때 유한한 수명을 추가하고 캐시 적중이 시한을 옮기지 않게 합니다.
계속 Terminal의 /home/labex/project/cache-desk에서 작업하세요. 기존 완전한 키를 확인하세요:
./desk inspect north MUG USD
pttl_ms는 밀리초 단위 잔여 수명입니다. -1은 만료가 없음을, -2는 키가 없음을 뜻합니다. 양수 값은 줄어듭니다. 만료 시한 없는 값은 외부 가격 변경 이후에도 무기한 남을 수 있습니다.
Redis SET key value EX seconds는 값과 만료를 한 명령에 저장합니다. 이 교육용 매장에서는 15초를 선택하세요. 허용되는 채우기는 12초부터 20초 사이의 수명으로 시작해야 합니다. 짧은 간격은 자연 만료를 관찰하기 위한 것이며 운영 TTL 권장이 아닙니다. 미스일 때만 시한을 설정하세요. 매 적중에서 갱신하면 인기 있는 오래된 가격이 무기한 남을 수 있습니다. 만료 중인 키를 일반 SET으로 덮어쓰면 보존을 명시적으로 요청하지 않은 한 이전 만료가 지워집니다.
같은 완전한 식별 정보와 만료가 있는 SET을 사용하는 파일로 덮어쓰세요. Python의 별도 인수 "EX", 15는 Redis에 전달됩니다. 15는 따옴표로 감싼 식별자가 아니라 정수입니다.
cat > policy.py <<'POLICY'
def cache_key(prefix, identity):
return f"{prefix}:{identity[0]}:{identity[1]}:{identity[2]}"
def read_price(source, cache, prefix, identity):
key = cache_key(prefix, identity)
value = cache.command("GET", key)
if value is not None:
return int(value), "cache"
cents = source.read(identity)
cache.command("SET", key, cents, "EX", 15)
return cents, "source"
def change_price(source, cache, prefix, identity, cents):
source.write(identity, cents)
POLICY
앞 단계에서 채운 완전한 식별 정보의 값에는 여전히 만료가 없습니다. 코드를 바꿔도 기존 값에 소급해서 시한이 추가되지는 않습니다. forget은 알려진 식별 조합 하나의 현재 캐시 키만 의도적으로 삭제하고 기본 가격과 다른 키는 그대로 둡니다. 명시적으로 폐기 가능한 연습 항목 네 개를 각각 제거하세요. 이는 학습자의 명시적인 동작이며 광범위한 비우기나 숨겨진 읽기 도구 복구가 아닙니다. 이후 채우기는 모두 새 시한을 사용합니다. 그런 다음 North 가격을 채우고 확인하세요:
./desk forget north MUG USD
./desk forget south MUG USD
./desk forget north MUG EUR
./desk forget north FREE USD
./desk view north MUG USD
./desk inspect north MUG USD
./desk view north MUG USD
./desk inspect north MUG USD
만료 전에 실행하면 첫 조회는 source/1, 다음은 cache/0입니다. 양수 PTTL은 15000으로 다시 시작하지 않고 줄어듭니다. 읽는 데 15초보다 오래 걸리면 실제 미스가 예상됩니다. 정책을 바꾸지 말고 채우기와 확인 명령을 신속히 반복하세요.
제공된 읽기 전용 연결로 Redis 자체 값도 읽을 수 있습니다. ./redis는 일반 Redis 서비스가 아니라 이 과정의 전용 Redis로 인수를 보냅니다:
./redis GET catalog:north:MUG:USD
./redis TTL catalog:north:MUG:USD
래퍼는 "1200" 같은 JSON 문자열, Redis 자체 정수 TTL, 또는 값이 없으면 null을 출력합니다. 누락된 가격을 가져오지 않습니다. 이제 sleep 16은 셸에 실제 16초 대기를 요청합니다. 시간을 시뮬레이션하거나 키를 대신 삭제하지 않습니다:
sleep 16
./desk inspect north MUG USD
./desk view north MUG USD
./desk view north MUG USD
다시 채우기 전 inspect는 value: null과 PTTL -2를 보여 줍니다. 다음 조회는 원본을 다시 읽고 그다음은 Redis에 적중할 수 있습니다. 이 단원에서 모든 기준 가격은 변경되지 않습니다. 채점기는 격리 키에서 실제 만료를 시험합니다. 읽는 동안 실제 키가 자연 만료될 수 있으므로 짧은 카운트다운과 경주해야 완료되는 것은 아닙니다.
요약
실제 Redis 키에서 매장, SKU, 통화를 구분하고, 가격 0을 보존하며, 기본 데이터베이스 읽기 횟수로 캐시 적중을 검증하고, 캐시를 채울 때마다 적중으로 연장되지 않는 수명을 부여했습니다. 정책은 재사용할 수 있으며 준비된 기본 데이터베이스와 무관한 카탈로그 데이터는 그대로 유지됩니다.



