LRU(Least Recently Used) 캐시는 크기를 정해 두고, 가득 차면 가장 오랫동안 쓰지 않은 항목부터 버리는 메모리 캐시다. Node.js에서는 lru-cache 패키지가 대표적이다. 자주 쓰는 데이터는 계속 남고 안 쓰는 것만 밀려난다.
import { LRUCache } from 'lru-cache'
const cache = new LRUCache({ max: 500, ttl: 1000 * 60 }) // 최대 500개, 1분 만료
async function getProfile(id) {
const hit = cache.get(id)
if (hit) return hit
const profile = await db.users.find(id)
cache.set(id, profile)
return profile
}- 용도: 비싼 DB(Database) 조회·외부 API(Application Programming Interface)·계산 결과, 자주 요청되는 응답, DNS(Domain Name System)·파일 메타데이터, 짧게 사는 세션·토큰, 요청 횟수 집계(요청 제한 (Throttling))
- 해시 맵(Hash Map)과 이중 연결 리스트(Doubly Linked List)를 조합하면 조회·갱신·제거를 모두 O(1)에 할 수 있다(해시 테이블, 연결 리스트)
- 프로세스 메모리 안에 있어서 서버를 여러 대로 늘리면 서버마다 따로 캐시된다. 공유가 필요하면 Redis (인메모리 저장소) 같은 외부 저장소를 쓴다(수직 확장과 수평 확장)
층이 다른 캐시들
[브라우저: TanStack Query] → [서버 API: lru-cache] → [DB]
네트워크 요청을 줄임 DB·외부 호출을 줄임- TanStack Query는 브라우저에서 같은 요청을 다시 보내지 않게 하고, 로딩·재요청·UI 연동까지 맡는다
- lru-cache는 서버에서 같은 조회를 다시 하지 않게 하는 범용 저장소다. 상태나 UI 연동은 없다
- React.cache는 요청 한 번 안에서만 산다
- 둘을 함께 쓰면 2단 캐시가 된다. 일반적인 캐시 배치 전략은 읽기 캐시 전략