캐시 읽기 전략과 캐시 쓰기 전략

유정원·2024년 9월 2일

python

목록 보기
19/21

캐시는 데이터베이스나 원본 데이터 소스보다 빠른 접근 속도를 제공하는 임시 저장소로, 성능 최적화를 위해 자주 사용됩니다. 캐시를 효과적으로 활용하기 위해서는 데이터를 언제, 어떻게 캐시에 저장하고, 언제 캐시에서 데이터를 읽어올지에 대한 전략이 필요합니다. 이러한 전략은 캐시 읽기 전략과 캐시 쓰기 전략으로 구분됩니다.

캐시 읽기 전략

1. Cache-Aside (Lazy Loading)

  • 개념: 애플리케이션이 데이터를 요청할 때, 먼저 캐시에 해당 데이터가 있는지 확인합니다. 만약 캐시에 데이터가 없다면(캐시 미스), 원본 데이터 소스(예: 데이터베이스)에서 데이터를 가져와 캐시에 저장한 후, 그 데이터를 반환합니다.
  • 장점:
    • 필요할 때만 데이터를 캐시에 로드하므로 메모리 효율성이 좋습니다.
    • 데이터의 최신 상태를 유지하기 쉽습니다.
  • 단점:
    • 첫 번째 요청 시 캐시 미스로 인해 지연이 발생할 수 있습니다.
  • 사용 예시:
    def get_data(key):
        value = cache.get(key)
        if not value:
            value = database.get(key)
            cache.set(key, value)
        return value

2. Write-Through

  • 개념: 데이터를 캐시에 먼저 쓰고, 동시에 원본 데이터 소스에도 데이터를 저장하는 전략입니다. 이 전략에서는 캐시가 항상 최신 상태의 데이터를 가지고 있습니다.
  • 장점:
    • 캐시와 데이터베이스 간의 데이터 일관성이 보장됩니다.
  • 단점:
    • 쓰기 작업이 느려질 수 있으며, 데이터베이스 쓰기 성능에 영향을 받을 수 있습니다.
  • 사용 예시:
    def write_data(key, value):
        cache.set(key, value)
        database.set(key, value)

3. Read-Through

  • 개념: 애플리케이션이 데이터를 요청할 때, 항상 캐시를 통해 요청하며, 캐시가 원본 데이터 소스에서 데이터를 가져와 캐시에 저장한 후 반환하는 전략입니다. 애플리케이션은 캐시에서만 데이터를 읽고, 캐시는 필요할 때 원본 데이터 소스에서 데이터를 가져옵니다.
  • 장점:
    • 캐시 읽기와 캐시 로드가 통합되어 있어 코드가 간단해집니다.
  • 단점:
    • 구현 복잡도가 높을 수 있으며, 캐시 제공자가 Read-Through 전략을 지원해야 합니다.
  • 사용 예시:
    # 캐시가 제공하는 방식으로, 캐시에 미스가 발생하면 원본 데이터 소스에서 자동으로 데이터를 가져옴
    value = cache.read_through(key)

4. Write-Behind (Write-Back)

  • 개념: 데이터를 캐시에만 쓰고, 실제 데이터베이스에는 일정 시간 후 비동기적으로 데이터를 저장하는 전략입니다. 이 방식은 캐시의 쓰기 성능을 최대화하며, 데이터베이스에 대한 쓰기 부하를 줄일 수 있습니다.
  • 장점:
    • 쓰기 작업이 매우 빠르며, 데이터베이스에 대한 부하를 줄일 수 있습니다.
  • 단점:
    • 시스템이 중단되면 캐시에 있는 데이터가 영구적으로 손실될 위험이 있습니다.
  • 사용 예시:
    def write_data(key, value):
        cache.set(key, value)
        # 데이터베이스에 비동기적으로 쓰기
        async_database_write(key, value)

캐시 쓰기 전략

1. Write-Through

  • 개념: 앞서 설명한 것처럼, 캐시에 데이터를 쓰는 동시에 원본 데이터 소스에도 데이터를 저장하는 방식입니다. 데이터 일관성이 보장되지만, 쓰기 작업이 느려질 수 있습니다.
  • 장점: 데이터 일관성 유지.
  • 단점: 쓰기 성능 저하 가능.

2. Write-Around

  • 개념: 데이터를 캐시에는 쓰지 않고, 원본 데이터 소스에만 쓰는 방식입니다. 이 경우 캐시에는 데이터가 없기 때문에, 다음에 해당 데이터를 읽을 때 캐시 미스가 발생할 가능성이 높습니다.
  • 장점: 캐시에 불필요한 데이터를 저장하지 않아 메모리 효율이 좋습니다.
  • 단점: 자주 액세스되는 데이터에 대해 캐시 미스가 자주 발생할 수 있습니다.
  • 사용 예시:
    def write_data(key, value):
        database.set(key, value)
        # 캐시에는 쓰지 않음

3. Write-Behind (Write-Back)

  • 개념: 데이터를 캐시에만 쓰고, 실제 원본 데이터 소스에는 비동기적으로 나중에 저장하는 방식입니다. 이 방식은 캐시의 쓰기 성능을 최대화하고, 데이터베이스에 대한 부하를 줄이는 데 효과적입니다.
  • 장점: 높은 쓰기 성능.
  • 단점: 시스템 장애 시 데이터 손실 위험.

캐시 무효화(Cache Invalidation) 전략

캐시의 데이터가 더 이상 유효하지 않으면 이를 무효화해야 합니다. 무효화 전략에는 다음과 같은 방법들이 있습니다:

  1. 시간 기반 무효화(Time-Based Invalidation): 캐시 항목에 TTL(Time-To-Live)을 설정하여 일정 시간이 지나면 자동으로 캐시를 무효화합니다.
  2. 명시적 무효화(Explicit Invalidation): 애플리케이션에서 데이터가 변경될 때 명시적으로 캐시를 무효화합니다.
  3. LRU(Least Recently Used): 가장 최근에 사용되지 않은 항목을 캐시에서 제거하는 방식입니다.

요약

  • 캐시 읽기 전략은 데이터가 필요할 때 캐시에서 어떻게 데이터를 가져올지에 대한 방법을 정의합니다. 대표적인 전략으로 Cache-Aside, Read-Through, Write-Through 등이 있습니다.
  • 캐시 쓰기 전략은 데이터를 캐시에 어떻게 저장할지에 대한 방법을 정의합니다. 대표적인 전략으로 Write-Through, Write-Around, Write-Behind가 있습니다.
  • 각 전략은 성능, 데이터 일관성, 메모리 효율성 등 다양한 측면에서 장단점이 있으므로, 애플리케이션의 요구사항에 맞게 적절한 전략을 선택하는 것이 중요합니다.

0개의 댓글