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