Memcache 사용

이 페이지에서는 Google Cloud Platform Console을 사용하여 애플리케이션에 Memcache 서비스를 구성하고 모니터링하는 방법을 설명합니다. 또한 App Engine memcache Python API를 사용하여 캐시된 값을 설정하고 검색하는 방법을 설명하며, 비교 및 설정 기능을 사용하여 해당 Memcache 키에 대한 동시 쓰기 요청을 처리하는 방법도 설명합니다. Memcache에 대한 자세한 내용은 Memcache 개요를 참조하세요.

Memcache 구성

  1. Google Cloud Platform Console의 Memcache 페이지로 이동합니다.
    Memcache 페이지로 이동
  2. 사용하려는 Memcache 서비스 수준을 선택합니다.

    • 공유(기본값) - 가급적 최대한의 캐시 용량을 확보하여 제공합니다.
    • 전용 - 캐시 크기의 GB 시간 단위로 요금이 청구되며, 애플리케이션 전용으로 할당되는 고정 캐시 용량을 제공합니다.

    사용 가능한 서비스 등급에 대한 자세한 내용은 Memcache 개요를 참조하세요.

값 캐싱 및 검색

값 캐싱

키의 값이 존재하지 않는 경우에만 add()를 사용하여 선택적 만료 시간과 함께 키의 값을 추가합니다.

memcache.add(key="[KEY]", value="[VALUE]", time=[EXPIRATION_TIME])

예를 들어 raining 값을 weather_USA_98105 키에 추가하고 만료 시간을 값이 쓰여진 시점으로부터 1시간으로 설정하려면 다음과 같이 입력합니다.

memcache.add(key="weather_USA_98105", value="raining", time=3600)

add() 및 기타 값 설정 메서드에 대한 자세한 내용은 Memcache Python API 문서를 참조하세요.

다른 값 캐싱 예는 Memcache 예를 참조하세요.

캐시된 값 조회

get()을 사용하여 단일 키의 값을 조회합니다.

memcache.get(key="[KEY]")

예를 들어 weather_USA_98105 키의 값을 가져오려면 다음을 실행합니다.

memcache.get(key="weather_USA_98105")

get() 및 기타 값 찾기 메서드에 대한 자세한 내용은 Memcache Python API 문서를 참조하세요.

Google Cloud Platform 콘솔에서 Memcache 모니터링

  1. Google Cloud Platform Console의 Memcache 페이지로 이동합니다.
    Memcache 페이지로 이동
  2. 다음 보고서를 확인합니다.
    • Memcache 서비스 수준: 애플리케이션이 공유 서비스 수준을 사용하고 있는지 아니면 전용 서비스 수준을 사용하고 있는지를 표시합니다. 프로젝트 소유자는 두 수준 간에 전환할 수 있습니다. 자세한 내용은 서비스 수준을 참조하세요.
    • 적중률: Memcache 적중 및 누락의 백분율과 총 횟수를 표시합니다.
    • 캐시의 항목 수
    • 가장 오래된 항목의 유지 기간: 가장 오래된 캐시된 항목의 유지 기간입니다. 항목의 유지 기간은 항목이 사용(읽기 또는 쓰기)될 때마다 재설정됩니다.
    • 총 캐시 크기
  3. 다음과 같은 작업을 수행할 수 있습니다.

    • 새 키: 캐시에 새 키를 추가합니다.
    • 키 찾기: 기존 키를 검색합니다.
    • 캐시 삭제: 캐시에서 모든 키-값 쌍을 삭제합니다.
  4. (전용 Memcache에만 해당) 핫 키 목록을 살펴봅니다.

    • '핫 키'는 Memcache에서 수신 QPS(초당 쿼리 수)가 100을 초과하는 키입니다.
    • 이 목록에는 최대 100개의 핫 키가 QPS가 많은 순서대로 포함됩니다.
    • 키스페이스에 보다 균등하게 부하를 분산하는 방법에 대한 도움말은 App Engine Memcache 권장사항을 참조하세요.

동시 쓰기 처리

비교 및 설정 기능을 사용하여 여러 요청에서 같은 Memcache 키에 쓰는 작업을 처리하려면 다음 단계를 따르세요.

  1. Memcache Client 객체를 인스턴스화합니다.
  2. 재시도 루프를 사용합니다(재시도 횟수 제한이 있고 지수 백오프를 사용하는 것이 좋음).
    1. 재시도 루프 내에서 gets() 또는 get_multi()를 사용하고 for_cas 매개변수를 True로 설정하여 키를 가져옵니다.
    2. 재시도 루프 내에서 cas() 또는 cas_multi()를 사용하여 키 값을 업데이트합니다.

다음 스니펫은 비교 및 설정 기능을 사용하는 한 가지 방법을 보여줍니다.

def bump_counter(key):
   client = memcache.Client()
   while True: # Retry loop
     counter = client.gets(key)
     if counter is None: raise KeyError('Uninitialized counter')
     if client.cas(key, counter+1):
        break

루프 없이는 이 코드가 경합 상태를 감지하기만 하고 방지하지는 못하기 때문에 재시도 루프가 필요합니다. Memcache 서비스는 여기에 나와 있는 패턴으로 사용하면(gets()cas() 사용) 2개 이상의 서로 다른 클라이언트 인스턴스가 경합 상태에 빠질 경우 cas() 작업을 먼저 실행하는 인스턴스만 성공하고(True를 반환함) 두 번째와 그 이후의 인스턴스는 실패(False)하게 만듭니다.

이 샘플 코드에서는 같은 카운터에 경합이 많이 발생하는 최악의 시나리오에서 무한 루프를 방지하기 위해 재시도 횟수에 제한을 설정해야 합니다. 이러한 경합이 발생할 수 있는 상황의 예로는 Memcache 서비스가 실시간으로 처리할 수 있는 것보다 더 많은 요청이 카운터를 업데이트하려고 하는 경우를 들 수 있습니다.

비교 및 설정에 대한 자세한 내용은 Memcache 개요를 참조하세요.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Python 2용 App Engine 표준 환경