构建 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中文网其他相关文章!