> 웹 프론트엔드 > JS 튜토리얼 > Node.js 및 TypeScript에서 LRU 캐시 사용

Node.js 및 TypeScript에서 LRU 캐시 사용

Linda Hamilton
풀어 주다: 2025-01-15 10:19:44
원래의
611명이 탐색했습니다.

웹 애플리케이션을 구축할 때 비용이 많이 드는 특정 작업을 수행해야 하는 경우가 종종 있습니다. 계산량이 많기 때문에 완료하는 데 시간이 오래 걸리거나 비용이 많이 드는 외부 API 호출이 필요합니다. 물론 이에 대한 예는 많지만 가장 일반적인 예는 다음과 같습니다.

많은 경우 간단한 해결책은 캐싱을 사용하는 것입니다. 캐싱은 특정 작업의 결과를 저장하여 동일한 데이터가 다시 요청될 경우 해당 작업을 다시 수행할 필요가 없도록 하는 기술입니다.

캐싱에는 다양한 접근 방식이 있지만 이번 게시물에서는 lru-cache 패키지를 사용하여 TypeScript로 Node.js에서 LRU 캐시를 구현하는 방법을 보여드리겠습니다.

LRU 캐시 설정

시작하려면 lru-cache 패키지를 설치해야 합니다.

npm install lru-cache
로그인 후 복사

그런 다음 사용자 데이터를 저장하기 위해 LRU 캐시를 설정하겠습니다. 이 캐시의 최대 크기는 5입니다. 즉, 한 번에 최대 5개의 사용자 개체를 보유할 수 있습니다. 초기화 방법은 다음과 같습니다.

import { LRUCache } from 'lru-cache';

const userCache = new LRUCache<number, User>({ max: 5 });
로그인 후 복사

Using LRU Cache in Node.js and TypeScript

API에서 데이터 가져오기

다음으로 외부 API에서 데이터 가져오기를 시뮬레이션해야 합니다. 사용자 ID를 가져와 사용자 개체를 반환하는 fetchUserFromAPI라는 함수를 만듭니다. 이 기능에는 네트워크를 통해 데이터를 가져오는 데 걸리는 시간을 모방하기 위한 지연이 포함됩니다.

async function fetchUserFromAPI(userId: number): Promise<User | null> {
    console.log(`Fetching user data for ID: ${userId} from API...`);
    await new Promise(resolve => setTimeout(resolve, 500));

    const users: User[] = [
        { id: 1, name: 'Alice', email: 'alice@example.com' },
        { id: 2, name: 'Bob', email: 'bob@example.com' },
        { id: 3, name: 'Charlie', email: 'charlie@example.com' },
    ];

    const user = users.find((user) => user.id === userId);
    return user || null;
}
로그인 후 복사

LRU 캐시 사용

이제 LRU 캐시를 사용하는 getUser라는 함수를 만들어 보겠습니다. 이 기능은 먼저 사용자 데이터가 이미 캐시에 있는지 확인합니다. 그렇다면 캐시된 데이터를 반환합니다. 그렇지 않은 경우 API에서 데이터를 가져와 캐시에 추가합니다.

async function getUser(userId: number): Promise<User | null> {
    const cachedUser = userCache.get(userId);

    if (cachedUser) {
        console.log(`User data for ID: ${userId} found in cache.`);
        return cachedUser;
    }

    const user = await fetchUserFromAPI(userId);
    if (user) {
        userCache.set(userId, user);
    }
    return user;
}
로그인 후 복사

LRU 캐시 테스트

LRU 캐시가 작동하는 모습을 보기 위해 사용자 데이터에 대해 여러 가지 요청을 하는 기본 기능을 만들어 보겠습니다. 이는 캐시가 작동하는 방식과 캐시가 가득 찼을 때 최근에 가장 적게 사용된 항목을 제거하는 방법을 보여줍니다.

async function main() {
    // First request, will fetch from API
    console.log('First Request')
    let user1 = await getUser(1);
    console.log('User 1:', user1);
    console.log('-------------------')

    // Second request for the same user, will be served from cache
    console.log('Second Request')
    user1 = await getUser(1);
    console.log('User 1:', user1);
    console.log('-------------------')

    // Request for a different user, will fetch from API
    console.log('Third Request')
    const user2 = await getUser(2);
    console.log('User 2:', user2);
    console.log('-------------------')

    // Request for a new user, will fetch from API
    console.log('Fourth Request')
    const user3 = await getUser(3);
    console.log('User 3:', user3);
    console.log('-------------------')

    // Request for the first user again, will be served from the cache
    console.log('Fifth Request')
    const user1Again = await getUser(1);
    console.log('User 1 Again:', user1Again);
    console.log('-------------------')

    // Request for a user that was not fetched yet, will fetch from API
    console.log('Sixth Request')
    const user4 = await getUser(4);
    console.log('User 4:', user4);
    console.log('-------------------')

    // Request for the second user again, will be served from the cache
    console.log('Seventh Request')
    const user2Again = await getUser(2);
    console.log('User 2 Again:', user2Again);
    console.log('-------------------')

    // Request for a new user, will fetch from API, and the first user will be evicted from the cache
    console.log('Eighth Request')
    const user5 = await getUser(5);
    console.log('User 5:', user5);
    console.log('-------------------')

    // Request for the first user again, will fetch from API because it was evicted
    console.log('Ninth Request')
    const user1AgainAgain = await getUser(1);
    console.log('User 1 Again Again:', user1AgainAgain);
    console.log('-------------------')
}

main();
로그인 후 복사

LRU 캐시 작동 방식

처음 사용자 데이터를 요청하면 API에서 데이터가 제공됩니다. 그러나 동일한 사용자에게 다시 요청하면 캐시에서 데이터를 가져오므로 요청 속도가 훨씬 빨라집니다. 이렇게 하면 API의 부하가 줄어들고 애플리케이션 성능이 향상됩니다.

LRU 캐시의 최대 크기는 5입니다. 여섯 번째 사용자를 요청하면 가장 최근에 사용된 항목(이 경우 첫 번째 사용자)이 캐시에서 제거되어 새 데이터를 위한 공간을 확보합니다. 그런 다음 첫 번째 사용자를 다시 요청하면 더 이상 캐시에 없기 때문에 API에서 가져와야 합니다.

LRU 캐시 사용의 이점

보시다시피 동일한 사용자 데이터를 여러 번 요청하면 캐시에서 제공되므로 요청 속도가 훨씬 빨라집니다. 이렇게 하면 API의 부하가 줄어들고 애플리케이션 성능이 향상되며 많은 경우 리소스와 비용을 많이 절약할 수 있습니다.

이 게시물이 도움이 되셨기를 바랍니다. 질문이나 의견이 있으시면 아래에 남겨주세요.

위 내용은 Node.js 및 TypeScript에서 LRU 캐시 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿