본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

개발 문서
LRU 캐시
LRU 캐시대표 구현단계별 안내서공식 문서 · 참고 자료토론댓글

다른 알고리즘

알고리즘 기초5
복잡도 분석정렬탐색기본 자료구조트리와 힙
알고리즘 핵심6
그래프 탐색최단 경로와 최소 신장 트리동적 계획법탐욕 알고리즘분할 정복백트래킹
알고리즘 심화5
문자열 알고리즘수학과 정수론비트 연산구간 트리유니온 파인드
실무 알고리즘3
코딩 면접 풀이 전략레이트 리미터일관된 해시

알고리즘

LRU 캐시

LRU 캐시는 가득 찼을 때 가장 오랫동안 쓰이지 않은 항목을 버리는 캐시로, 해시 맵과 이중 연결 리스트로 조회와 저장을 O(1)에 처리합니다.

안내서 시작하기토론

LRU(Least Recently Used) 캐시는 용량이 정해진 캐시가 가득 찼을 때 가장 오래전에 사용한 항목부터 제거하는 교체 정책과 그 자료 구조를 말합니다. 최근에 쓴 데이터는 곧 다시 쓰일 가능성이 높다는 시간 지역성에 기대어 있으며, FIFO와 달리 조회할 때마다 항목의 순서를 새로 고칩니다. 표준 구현은 키로 노드를 찾는 해시 맵과 사용 순서를 유지하는 이중 연결 리스트를 함께 써서 get과 put을 모두 평균 O(1)에 처리합니다.

LRU는 CPU 캐시와 운영체제의 페이지 캐시, 데이터베이스 버퍼 풀, Redis의 메모리 제거 정책, CDN과 브라우저 캐시 등 시스템의 거의 모든 층에서 그대로 또는 근사 형태로 쓰입니다. Python의 functools.lru_cache와 OrderedDict, Java의 LinkedHashMap처럼 언어 표준 라이브러리에도 들어 있습니다. 또한 해시 맵과 연결 리스트를 함께 다루는 설계 문제라서 코딩 테스트와 기술 면접에 자주 나옵니다.

먼저 FIFO, LRU, LFU, TTL 같은 교체 정책의 차이와 적중률 개념을 익힌 뒤, 작은 요청 순서를 손으로 추적해 보는 것이 좋습니다. 이어서 보초 노드를 둔 이중 연결 리스트와 딕셔너리로 직접 구현하고, OrderedDict나 LinkedHashMap 같은 라이브러리 버전과 비교해 봅니다. 마지막으로 스레드 안전성, 캐시 무효화, TTL과의 조합처럼 실무에서 부딪히는 문제를 연습 문제로 다뤄 보면 됩니다.

특징

최근 사용 순서

조회나 저장에 성공할 때마다 항목을 가장 최근 쪽으로 옮기고, 공간이 모자라면 반대쪽 끝의 항목을 제거합니다.

해시 맵 + 이중 연결 리스트

맵은 키로 노드를 바로 찾고, 리스트는 노드를 O(1)에 떼어 내고 앞에 붙여 순서를 유지합니다.

O(1) 연산

get과 put 모두 정해진 개수의 포인터만 바꾸므로 평균 상수 시간에 끝나며, 공간은 용량에 비례합니다.

다양한 변형

실무에서는 CLOCK, 의사 LRU, 표본 추출 LRU, 2Q, W-TinyLFU처럼 비용을 줄이거나 스캔에 강한 변형을 많이 씁니다.

이 쪽 차례

  1. 특징
  2. 이런 곳에 씁니다
  3. 대표 구현
  4. 단계별 안내서
  5. 공식 문서 · 참고 자료
  6. 토론
  7. 댓글

이런 곳에 씁니다

  • 함수 결과 메모이제이션
  • Redis 같은 인메모리 캐시의 메모리 제거
  • 운영체제 페이지 캐시와 데이터베이스 버퍼 풀
  • CDN과 브라우저의 HTTP 캐시

대표 구현

딕셔너리가 키를 노드에 연결하고, 보초 노드 head와 tail 사이의 이중 연결 리스트가 사용 순서를 유지합니다. get은 노드를 맨 앞으로 옮기고, put은 가득 찼을 때 tail 바로 앞의 노드를 제거합니다. python lru_cache.py로 실행하면 "b"가 제거되어 None 1 3이 출력됩니다.

lru_cache.py

class Node:
    __slots__ = ("key", "value", "prev", "next")

    def __init__(self, key=None, value=None):
        self.key, self.value = key, value
        self.prev = self.next = None


class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self.map = {}                           # key -> Node
        self.head, self.tail = Node(), Node()   # sentinels
        self.head.next, self.tail.prev = self.tail, self.head

    def _unlink(self, node):
        node.prev.next, node.next.prev = node.next, node.prev

    def _push_front(self, node):
        node.prev, node.next = self.head, self.head.next
        self.head.next.prev = node
        self.head.next = node

    def get(self, key, default=None):
        node = self.map.get(key)
        if node is None:
            return default
        self._unlink(node)                      # touch: move to the front
        self._push_front(node)
        return node.value

    def put(self, key, value):
        if self.capacity <= 0:
            return
        node = self.map.get(key)
        if node is not None:
            node.value = value
            self._unlink(node)
            self._push_front(node)
            return
        if len(self.map) >= self.capacity:      # evict the least recently used
            lru = self.tail.prev
            self._unlink(lru)
            del self.map[lru.key]
        node = Node(key, value)
        self.map[key] = node
        self._push_front(node)


cache = LRUCache(2)
cache.put("a", 1)
cache.put("b", 2)
cache.get("a")                                  # "a" is now the most recent
cache.put("c", 3)                               # full: evicts "b"
print(cache.get("b"), cache.get("a"), cache.get("c"))  # None 1 3
python lru_cache.py

단계별 안내서

설치부터 LRU 캐시 의 핵심 개념까지, 여섯 장으로 차근차근 따라 합니다.

  1. LRU 캐시 개념
  2. LRU 캐시의 동작 원리
  3. LRU 캐시 구현
  4. LRU 캐시의 복잡도
  5. LRU 연습 문제
  6. 실무 속의 LRU

공식 문서 · 참고 자료

  • 공식functools.lru_cache
  • 공식collections.OrderedDict
  • 공식LinkedHashMap (Java SE 21)
  • 공식Key eviction (Redis)
  • 참고서Cache replacement policies
  • 참고서Cache (computing)
  • 참고서Map (MDN Web Docs)
  • 커뮤니티LRU Cache (LeetCode 146)

토론

토론 시작하기

LRU 캐시 에 관해 묻고, 경험을 나누고, 의견을 주고받는 곳입니다.

아직 토론이 없습니다. 첫 이야기를 시작해 보세요.

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.