TopDev

Ứng dụng Cache manager và Chokidar nâng cấp hệ thống xử lý cache cho Website

minhdev 📖 5 phút đọc

Để nâng cấp hệ thống xử lý cache cho một website, bạn có thể kết hợp Cache Manager (để quản lý cache hiệu quả) và Chokidar (để giám sát file và cập nhật cache động). Giải pháp này phù hợp với các ứng dụng yêu cầu tính năng caching mạnh mẽ và tự động đồng bộ hóa khi dữ liệu nguồn thay đổi.

Dưới đây là cách triển khai và các bước chi tiết:



1. Sử dụng Cache Manager để quản lý cache hiệu quả#

Cache Manager là gì?#

  • Cache Manager là một thư viện Node.js hỗ trợ quản lý cache với nhiều backend (như memory, file system, Redis, hoặc Memcached).

  • Nó cung cấp các API linh hoạt để lưu trữ, làm mới, và xóa cache.

Cách triển khai Cache Manager#

Cài đặt

npm install cache-manager npm install cache-manager-fs-hash

Triển khai

Kết hợp caching trong bộ nhớ (in-memory) và trên ổ đĩa (file system cache):

` const cacheManager = require('cache-manager'); const fsStore = require('cache-manager-fs-hash');

// Bộ nhớ (in-memory cache) const memoryCache = cacheManager.caching({ store: 'memory', max: 100, ttl: 60 /* seconds */ });

// Lưu trên ổ đĩa const fileCache = cacheManager.caching({ store: fsStore, options: { path: 'cache', // Thư mục lưu cache ttl: 60 * 60, // Thời gian sống (TTL) là 1 giờ subdirs: true, // Chia thư mục để tổ chức tốt hơn }, });

// Tạo cache đa tầng (multi-layer cache) const multiCache = cacheManager.multiCaching([memoryCache, fileCache]);

// Ví dụ lưu và lấy dữ liệu từ cache async function cacheData(key, value) { await multiCache.set(key, value, { ttl: 120 }); // Lưu cache với TTL 120 giây console.log(Data cached: ${key}); }

async function fetchData(key) { const data = await multiCache.get(key); if (data) { console.log(Cache hit: ${key}); return data; } else { console.log(Cache miss: ${key}); return null; } }

// Test lưu trữ và truy xuất cacheData('user:123', { name: 'John Doe', age: 30 }); fetchData('user:123'); `



2. Sử dụng Chokidar để đồng bộ hóa cache với tệp dữ liệu#

Chokidar là gì?#

  • Chokidar là một thư viện giám sát file system (file watcher) trong Node.js.

  • Khi có thay đổi (thêm, sửa, xóa) trong file hoặc thư mục, bạn có thể cập nhật cache tương ứng.

Cài đặt

npm install chokidar

Triển khai

Kết hợp Chokidar để theo dõi thay đổi trong file dữ liệu và cập nhật cache:

` const chokidar = require('chokidar');

// Đường dẫn tệp hoặc thư mục cần theo dõi const watchPath = './data';

// Theo dõi file const watcher = chokidar.watch(watchPath, { ignored: /(^|[/\])../, // Bỏ qua các file ẩn persistent: true, });

// Xử lý sự kiện thay đổi file watcher .on('add', (path) => { console.log(File added: ${path}); updateCache(path); }) .on('change', (path) => { console.log(File changed: ${path}); updateCache(path); }) .on('unlink', (path) => { console.log(File removed: ${path}); removeFromCache(path); });

// Hàm cập nhật cache async function updateCache(filePath) { const fileContent = require('fs').readFileSync(filePath, 'utf-8'); const key = file:${filePath}; await multiCache.set(key, fileContent, { ttl: 300 }); console.log(Cache updated for ${filePath}); }

// Hàm xóa cache async function removeFromCache(filePath) { const key = file:${filePath}; await multiCache.del(key); console.log(Cache removed for ${filePath}); } `



3. Tích hợp Cache Manager và Chokidar vào website#

Mô hình hoạt động#

  • Cache Manager: Cache nội dung động (dynamic content) để giảm tải cho database hoặc API.

    • Cache được lưu trữ đa tầng: bộ nhớ RAM và ổ đĩa.
  • Chokidar: Theo dõi các file dữ liệu (như JSON, XML, Markdown) hoặc các file cấu hình để tự động cập nhật cache khi nội dung thay đổi.

Ví dụ tích hợp vào Express.js#

Kết hợp quản lý cache và giám sát file trong website:

` const express = require('express'); const cacheManager = require('cache-manager'); const chokidar = require('chokidar'); const fs = require('fs');

const app = express(); const PORT = 3000;

// Cache Manager const memoryCache = cacheManager.caching({ store: 'memory', max: 100, ttl: 60 }); const fileCache = cacheManager.caching({ store: fsStore, options: { path: 'cache', ttl: 3600 } }); const multiCache = cacheManager.multiCaching([memoryCache, fileCache]);

// Giám sát file với Chokidar const watcher = chokidar.watch('./data', { persistent: true });

watcher.on('change', async (path) => { const fileContent = fs.readFileSync(path, 'utf-8'); const key = file:${path}; await multiCache.set(key, fileContent); console.log(Cache updated for ${path}); });

// API lấy dữ liệu từ cache app.get('/data/:file', async (req, res) => { const filePath = ./data/${req.params.file}; const key = file:${filePath};

const cache = await multiCache.get(key);
if (cache) {
    console.log('Cache hit');
    res.send(cache);
} else {
    console.log('Cache miss');
    if (fs.existsSync(filePath)) {
        const content = fs.readFileSync(filePath, 'utf-8');
        await multiCache.set(key, content, { ttl: 300 });
        res.send(content);
    } else {
        res.status(404).send('File not found');
    }
}

});

app.listen(PORT, () => console.log(Server is running on port ${PORT})); `



4. Lợi ích của giải pháp#

Hiệu suất cao:#

  • Cache Manager giảm số lượng truy cập vào cơ sở dữ liệu hoặc hệ thống file.

  • Kết hợp in-memory và file cache giúp cân bằng giữa hiệu suất và lưu trữ.

Đồng bộ hóa tự động:#

  • Chokidar giúp đảm bảo dữ liệu trong cache luôn được cập nhật khi file nguồn thay đổi.

Tính linh hoạt:#

  • Cache đa tầng (in-memory + file) phù hợp với nhiều loại ứng dụng.

  • Hệ thống dễ dàng mở rộng để sử dụng các backend như Redis hoặc Memcached.

Dễ dàng bảo trì:#

  • Cơ chế tự động cập nhật và xóa cache giúp giảm công việc thủ công và tránh lỗi dữ liệu không đồng bộ.


Giải pháp này phù hợp cho các website hoặc API có nội dung thường xuyên thay đổi nhưng yêu cầu tốc độ phản hồi nhanh và tối ưu tài nguyên hệ thống.

Bài liên quan trong #Tin tức

✓ Đã sao chép link