data - LRU cache

🧐 What is caching

캐싱은 데이터를 읽어오는데 시간이 오래 걸리거나, 실행하는데 오래 걸리는 연산의 결과를 미리 계산하여 필요할 때 최초로 한번만 계산하여 저장해놓고 재사용하는 기술을 의미합니다.

프론트앤드에서는 클리이언트 컴퓨터에 캐시를 두고, 이 캐시에 전에 방문했던 웹페이지의 내용을 저장해놓고 동일한 페이지를 재방문시 이 저장해놓은 사본의 페이지를 보여주는 방식을 취할 수 있습니다.

백엔드에서는 클라이언트에서 받은 요청에 대한 처리 결과를 캐시에 저장해두고, 나중에 동일한 요청이 들어왔을 때, 저장해둔 결과를 그대로 응답합니다. 이렇게 하여 조회 속도를 향상시키고, 서버 단의 부하를 줄일 수 있습니다.

네트워크에서는 프록시 서버나 CDN을 대표적인 캐싱 사례로 볼 수 있습니다.

캐싱 전략이란?

일반적으로 캐싱을 위해 사용되는 저장 매체는 가격이 비쌉니다. 따라서, 저장 메체의 용량을 제한하여 최대한 효과적으로 사용하는 전략을 취합니다. 이것을 캐싱 전략이라고 합니다.

캐싱 전략은 캐시 용량이 꽉 찼을 때, 어떤 데이터를 남겨두고, 어떤 데이터를 지워야할지에 대한 방법을 뜻합니다. 캐싱 전략에는 아래와 같은 종류가 있습니다.

  • LRU(Least Recently Used) cache

  • MRU(Most Recently Used) cache

  • LFU(Least Frequently Used) cache

캐싱 전략 - LRU cache(Least Recently Used)

여기서는 LRU cache 전략에 대해서 알아보고자 합니다.

LRU cache 전략은 최근에 사용된 데이터일수록 앞으로도 사용될 가능성이 높다라는 가설을 바탕으로 만들어졌습니다. 이 전략은 가장 오랫동안 참조(사용)되지 않은 데이터를 삭제하여 공간을 확보하고, 조회한 데이터는 가장 최근에 사용된 데이터로 간주합니다. 메모리가 제한되어있고 자주 엑세스하는 데이터에 빠르게 엑세스 할 수 있어야 하는 시나리오에 유용합니다.

LRU cache의 세부 동작방식은 아래와 같습니다.

  • 새로운 데이터가 추가될 경우,

    • 캐시의 공간이 가득차지 않은 경우, 데이터를 가장 최근 위치로 이동시킵니다.

    • 캐시의 공간이 가득찬 경우, 가장 오랫동안 사용되지 않은 데이터를 제거하고, 새로운 데이터를 가장 최근 위치로 이동시킵니다.

  • 이미 존재하는 데이터를 조회할 경우,

    • 해당 데이터를 가장 최근 위치로 이동시킵니다.

📚 용어도 알아두면 좋습니다.

  • Cache Hit: 캐시에 원하는 데이터가 있어, 디스크에 접근하지 않고 데이터를 가져오는 것

  • Cache Miss: 캐시에 원하는 데이터가 없는 것

  • Eviction: 캐시 공간이 꽉차서 데이터를 제거하는 것

LRU cache 동작방식 알아보기

아래의 예시에서는 가장 왼쪽에 있는 데이터가 가장 최신에 [조회/삽입] 데이터라고 가정합니다.

Python에서 LRU 캐시 사용

functools 모듈의 lru_cache 데코레이터를 사용하여 LRU 캐시를 쉽게 구현할 수 있습니다.

maxsize 의 의미

lru_cache 데코레이의 매개변수 maxsize는 캐시에 저장할 수 있는 최대 항목 수를 지정합니다. 캐시가 이 크기를 초과하면 최근에 가장 적게 사용된 항목은 새 항목을 위한 공간을 확보하기 위해 제거됩니다.

명시적으로 지정하지 않은 경우 maxsize의 기본 값은 128입니다. 이 값을 None으로 설정하면 캐시가 제한 없이 커질 수 있기 때문에 주의해야합니다.

LRU 캐시 클래스 구현

Last updated