웹 애플리케이션을 구축할 때 비용이 많이 드는 특정 작업을 수행해야 하는 경우가 종종 있습니다. 계산량이 많기 때문에 완료하는 데 시간이 오래 걸리거나 비용이 많이 드는 외부 API 호출이 필요합니다. 물론 이에 대한 예는 많지만 가장 일반적인 예는 다음과 같습니다.
많은 경우 간단한 해결책은 캐싱을 사용하는 것입니다. 캐싱은 특정 작업의 결과를 저장하여 동일한 데이터가 다시 요청될 경우 해당 작업을 다시 수행할 필요가 없도록 하는 기술입니다.
캐싱에는 다양한 접근 방식이 있지만 이번 게시물에서는 lru-cache 패키지를 사용하여 TypeScript로 Node.js에서 LRU 캐시를 구현하는 방법을 보여드리겠습니다.
시작하려면 lru-cache 패키지를 설치해야 합니다.
npm install lru-cache
그런 다음 사용자 데이터를 저장하기 위해 LRU 캐시를 설정하겠습니다. 이 캐시의 최대 크기는 5입니다. 즉, 한 번에 최대 5개의 사용자 개체를 보유할 수 있습니다. 초기화 방법은 다음과 같습니다.
import { LRUCache } from 'lru-cache'; const userCache = new LRUCache<number, User>({ max: 5 });
다음으로 외부 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 캐시를 사용하는 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 캐시가 작동하는 모습을 보기 위해 사용자 데이터에 대해 여러 가지 요청을 하는 기본 기능을 만들어 보겠습니다. 이는 캐시가 작동하는 방식과 캐시가 가득 찼을 때 최근에 가장 적게 사용된 항목을 제거하는 방법을 보여줍니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!