ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js と TypeScript での LRU キャッシュの使用

Node.js と TypeScript での LRU キャッシュの使用

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-15 10:19:44613ブラウズ

Web アプリケーションを構築するとき、多くの場合、コストのかかる特定のアクションを実行する必要があります。計算量が多いため、完了までに時間がかかるか、高価な外部 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 キャッシュの動作を確認するために、ユーザー データに対していくつかのリクエストを行う main 関数を作成します。これは、キャッシュがどのように機能するか、およびキャッシュがいっぱいになったときに最も最近使用されていないアイテムをどのように削除するかを示します。

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 です。6 人目のユーザーをリクエストすると、最も最近使用されていないアイテム (この場合は最初のユーザー) がキャッシュから削除され、新しいデータ用のスペースが確保されます。その後、最初のユーザーを再度リクエストした場合、そのユーザーはキャッシュに存在しないため、API から取得する必要があります。

LRU キャッシュを使用する利点

ご覧のとおり、同じユーザー データを複数回リクエストすると、キャッシュからデータが提供されるため、リクエストが大幅に高速化されます。これにより、API の負荷が軽減され、アプリケーションのパフォーマンスが向上し、多くの場合、多くのリソースとお金を節約できます。

この投稿がお役に立てば幸いです。ご質問やご意見がございましたら、お気軽に以下に残してください。

以上がNode.js と TypeScript での LRU キャッシュの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。