Redis là gì và tại sao nó lại quan trọng?
Redis (Remote Dictionary Server) là một hệ thống lưu trữ cấu trúc dữ liệu dạng Key-Value lưu trên RAM (in-memory data store) mã nguồn mở với hiệu năng cực cao. Nhờ tốc độ đọc ghi đáng kinh ngạc (hơn 100,000 requests/giây), Redis được sử dụng phổ biến trong việc thiết lập bộ nhớ đệm (Caching) và làm hàng đợi thông điệp (Message Queue).
1. Các mô hình Caching phổ biến với Redis
Bộ nhớ đệm giúp giảm tải cho cơ sở dữ liệu quan hệ (RDBMS) và giảm độ trễ của API. Dưới đây là hai kiến trúc lưu cache kinh điển:
A. Cache-Aside Pattern (Lazy Loading)
Đây là mô hình thông dụng nhất:
- Ứng dụng nhận yêu cầu lấy dữ liệu.
- Kiểm tra trong Redis (Cache hit hay Cache miss).
- Nếu có (Cache Hit), trả về dữ liệu ngay lập tức.
- Nếu không (Cache Miss), truy vấn dữ liệu từ Database, lưu lại vào Redis rồi trả về cho client.
# Ví dụ Cache-Aside Pattern với Python
def get_user_profile(user_id):
cache_key = f"user:{user_id}"
# 1. Đọc từ Cache
cached_data = redis_client.get(cache_key)
if cached_data:
return json.loads(cached_data)
# 2. Cache Miss - Đọc từ Database
user = db.query("SELECT * FROM users WHERE id = %s", user_id)
if user:
# 3. Ghi lại vào Cache với TTL (Time-To-Live) là 1 giờ (3600 giây)
redis_client.setex(cache_key, 3600, json.dumps(user))
return user
B. Write-Through Pattern
Mô hình này cập nhật cache ngay khi dữ liệu được ghi vào cơ sở dữ liệu. Dữ liệu luôn luôn được ghi vào cache trước, sau đó mới cập nhật xuống DB, giúp dữ liệu trong cache không bao giờ bị lệch (stale).
2. Xây dựng Hàng đợi (Queue) hiệu năng cao
Redis có các kiểu dữ liệu có cấu trúc như List hoặc Stream rất thích hợp cho việc làm Message Queue:
- LPUSH & BRPOP: Đưa công việc vào đầu danh sách (Left Push) và lấy công việc ra ở cuối danh sách (Blocking Right Pop - chặn thread đợi cho đến khi có phần tử mới).
- Thư viện nâng cao: Để quản lý các tác vụ phức tạp (retry, delay job, priority queue), các lập trình viên thường dùng các engine xây dựng trên Redis như Celery (Python) hoặc BullMQ (Node.js).
// Ví dụ Producer/Consumer đơn giản bằng Node.js và Redis
// Producer.js - Gửi email job vào queue
await redis.lpush('email_queue', JSON.stringify({ to: 'admin@whoimai.dev', template: 'welcome' }));
// Consumer.js - Worker chạy ngầm xử lý công việc
while (true) {
// BRPOP chặn tối đa 30 giây để chờ job mới xuất hiện
const job = await redis.brpop('email_queue', 30);
if (job) {
const payload = JSON.parse(job[1]);
await sendEmail(payload.to, payload.template);
}
}
3. Các cơ chế đảm bảo an toàn dữ liệu (Persistence)
Vì lưu trên RAM, nếu Redis restart mà không cấu hình lưu file xuống đĩa, dữ liệu sẽ mất sạch. Redis cung cấp 2 giải pháp:
| Đặc trưng | RDB (Redis Database) | AOF (Append Only File) |
|---|---|---|
| Cơ chế | Chụp ảnh snapshot định kỳ và ghi xuống đĩa cứng. | Ghi log lại tất cả các lệnh ghi (write operations) ngay lập tức. |
| Hiệu năng | Rất cao khi khởi động lại dữ liệu lớn. | Chậm hơn do phải đọc lại toàn bộ file lệnh ghi dài để khôi phục. |
| An toàn | Có khả năng mất mát dữ liệu giữa các lần snapshot. | Cực kỳ an toàn (hầu như không mất mát dữ liệu). |
Bình luận (0)
Đang tải bình luận...