建立 Web 應用程式時,我們經常需要執行某些昂貴的操作。要么因為它們計算量大,需要很長時間才能完成,要么需要昂貴的外部 API 呼叫。當然,這樣的例子很多,但這些是最常見的一些。
在許多情況下,一個簡單的解決方案是使用快取。快取是一種技術,允許我們儲存某個操作的結果,這樣如果再次請求相同的數據,我們就不必再次執行該操作。
有許多不同的快取方法,但在這篇文章中,我將向您展示如何使用 lru-cache 套件透過 TypeScript 在 Node.js 中實作 LRU 快取。
首先,我們需要安裝 lru-cache 套件。
npm install lru-cache
然後,我們將設定一個 LRU Cache 來儲存使用者資料。這個快取的最大大小為 5,這意味著它一次最多可以容納 5 個使用者物件。以下是我們如何初始化它:
import { LRUCache } from 'lru-cache'; const userCache = new LRUCache<number, User>({ max: 5 });
接下來,我們需要模擬從外部 API 取得資料。我們將建立一個名為 fetchUserFromAPI 的函數,該函數接受使用者 ID 並傳回使用者物件。此函數將包含一個延遲,以模擬透過網路取得資料所需的時間。
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; }
現在,讓我們建立一個名為 getUser 的函數,它使用我們的 LRU 快取。該函數首先檢查用戶資料是否已在快取中。如果是,我們將返回快取的資料。如果沒有,我們將從 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 快取的運作情況,我們將建立一個主函數來發出多個使用者資料請求。這將演示快取如何運作以及如何在緩存滿時驅逐最近最少使用的項目。
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();
當我們第一次請求使用者資料時,它來自 API。但是當我們再次請求同一個使用者時,資料會從快取中提取,從而使請求速度更快。這減少了 API 的負載並提高了應用程式的效能。
LRU 快取的最大大小為 5。當我們要求第六個使用者時,最近最少使用的項目(在本例中為第一個使用者)將從快取中刪除,以便為新資料騰出空間。如果我們再次請求第一個用戶,則必須從 API 中取得它,因為它不再位於快取中。
如您所見,當我們多次要求相同的使用者資料時,它會從快取中提供,從而使請求速度更快。這減少了 API 的負載,提高了應用程式效能,並且在許多情況下,它可以為我們節省大量資源和金錢。
我希望您發現這篇文章有用。如果您有任何疑問或意見,請隨時在下面留言。
以上是在 Node.js 和 TypeScript 中使用 LRU 快取的詳細內容。更多資訊請關注PHP中文網其他相關文章!