Trong một dự án việc tối ưu hiệu năng là rất quan trọng, trong đó thì việc cache lại những dữ liệu thường dùng sẽ giúp cho dự án của chúng ta chạy nhanh hơn và giảm tải cho máy chủ.
Sơ đồ xử lý cache cơ bản
Theo sơ đồ xử lý cache cở bản (đã lượt bớt, có thể xem sơ đồ chi tiết ở cuối bài) thì chúng ta thấy có 2 trường hợp xảy ra:
Hiện tại có 2 loại cache trên Ram mà cực kỳ hiệu quả là Memcached và Redis cache. Hai loại này điều sử dụng Ram để lưu giá trị cache theo cứu pháp là key: value nên việc sử dụng 2 loại này gần giống như nhau.
Kiến trúc và sử dụng chính:
Tính năng và linh hoạt:
Hiệu suất và sử dụng trong ứng dụng:
Tóm lại, nếu bạn chỉ cache đơn giản thì sử dụng Memcached còn muốn sử dụng thêm nhiều tính năng hơn thì Redis nhé. Còn trong bài viết này mình sẽ sử dụng Redis cache, vì sao này mình có thể tận dùng thêm nhiều tín năng của Redis.
Yêu cầu: Bạn phải đang sử dụng Windows 10 phiên bản 2004 trở lên (Build 19041 trở lên) hoặc Windows 11 để sử dụng các lệnh dưới đây.
Mở Power Shell hoặc Windows Command Prompt (CMD) với quyền administrator
wsl --install
Tiến hành cài đặt Redis vào máy windows
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
Và cuối cùng là chạy dịch vụ của Redis
sudo service redis-server start
Trước tiên, bạn cần cài đặt Redis server trên máy của bạn. Bạn có thể tải và cài đặt Redis từ trang chủ chính thức của Redis hoặc sử dụng các công cụ quản lý gói như apt-get (cho Ubuntu).
sudo apt-get update
sudo apt-get install redis-server
sudo systemctl start redis-server
sudo systemctl enable redis-server
Chúng ta sẽ cài thông qua chương trình Homebrew của MacOS
brew install redis
brew services start redis
Bạn cần cài đặt hai gói là redis
và express-redis-cache
. redis
là thư viện để kết nối Node.js với Redis, và express-redis-cache
là một middleware để cache các response của Express.
npm install redis express-redis-cache
Dưới đây là một ví dụ đơn giản về cách tích hợp Redis cache trong một ứng dụng Express:
const express = require('express');
const redis = require('redis');
const cache = require('express-redis-cache')({ host: 'localhost', port: 6379 });
const app = express();
const port = 3000;
// Tạo một client Redis
const redisClient = redis.createClient({
host: 'localhost',
port: 6379,
});
// Kiểm tra kết nối Redis
redisClient.on('connect', function () {
console.log('Connected to Redis...');
});
redisClient.on('error', function (err) {
console.log('Redis error: ' + err);
});
// Middleware cache cho các route
app.get('/data', cache.route(), (req, res) => {
const data = { message: 'This is a cached response' };
res.json(data);
});
app.get('/nocache', (req, res) => {
const data = { message: 'This is not a cached response' };
res.json(data);
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
redis-server
node app.js
http://localhost:3000/data
. Lần truy cập đầu tiên sẽ lưu response vào cache của Redis. Các lần truy cập tiếp theo sẽ lấy dữ liệu từ cache.http://localhost:3000/nocache
để xem response không được cache.Lưu Ý:
- Bạn có thể cấu hình thêm thời gian sống của cache (TTL - Time To Live) và các thiết lập khác theo nhu cầu của bạn.
- Đảm bảo rằng Redis server đang chạy và có thể kết nối từ ứng dụng Node.js của bạn.
Với các bước trên, bạn đã tích hợp thành công Redis cache vào ứng dụng Node.js sử dụng Express.
Cài đặt thư viện redis
npm install redis
Cấu trúc thư mục
/app
/api
/data/route.js
layout.js
page.js
Trong tệp app/api/data/route.js, chúng ta sẽ thiết lập Redis cache và tạo một API endpoint để lấy dữ liệu:
import { createClient } from 'redis';
import { NextResponse } from 'next/server';
const redis = createClient({
url: 'redis://localhost:6379',
});
redis.connect().catch(console.error);
export async function GET() {
const cacheKey = 'data_key';
let cachedData;
try {
cachedData = await redis.get(cacheKey);
} catch (error) {
console.error('Error fetching from Redis', error);
}
if (cachedData) {
console.log('Serving from cache');
return NextResponse.json(JSON.parse(cachedData));
}
// Simulate fetching data from a database
const data = { message: 'This is the response from the server' };
try {
await redis.setEx(cacheKey, 60, JSON.stringify(data));
} catch (error) {
console.error('Error setting cache in Redis', error);
}
console.log('Serving from server');
return NextResponse.json(data);
}
Sơ đồ xử lý request và cache của Redis cache và Memcached