← ~/blog

Redis là gì? Giải thích dễ hiểu cho người mới bắt đầu

· 7 min read · Database & SQL

Redis là gì, vì sao nó nhanh, và được dùng vào những việc gì trong một ứng dụng web: cache, session, rate limiting, hàng đợi. Kèm những lưu ý khi tự cài Redis lần đầu.


1. Redis là gì và vì sao nó nhanh?

Khi hệ thống phải xử lý hàng ngàn hoặc hàng triệu truy vấn mỗi giây, truy vấn trực tiếp vào cơ sở dữ liệu trên ổ đĩa (Disk-based Database) sẽ nhanh chóng trở thành điểm nghẽn (bottleneck).

Redis lưu toàn bộ dữ liệu trong RAM thay vì trên ổ đĩa, nên đọc/ghi nhanh hơn nhiều so với database truyền thống. Nó thường được dùng cho:

  • Quản lý phiên người dùng (Session Management)
  • Lưu trữ bộ đệm (Caching Layer)
  • Xử lý dữ liệu thời gian thực (Real-time Processing & Leaderboards)
  • Hệ thống hàng đợi & tin nhắn (Queueing Systems & Pub/Sub)

2. Redis hoạt động như thế nào?

Khác với các cơ sở dữ liệu quan hệ lưu trữ dữ liệu theo bảng trên ổ đĩa, Redis hoạt động theo mô hình Key-Value trong bộ nhớ RAM.

text
+-------------------+        +-----------------------------------+
|   Client Request  | -----> |         Redis In-Memory           |
+-------------------+        |  (Strings, Hashes, Lists, Sets)   |
                             +-----------------------------------+
                                       |              |
                           (Optional Persistence) (Replication)
                                       |              |
                                       v              v
                              +-----------------+  +---------------+
                              |  Disk Snapshot  |  | Redis Slave   |
                              |   (RDB / AOF)   |  |  (Read-only)  |
                              +-----------------+  +---------------+

Các đặc điểm chính

  • In-Memory Storage: Truy xuất dữ liệu trong RAM giúp thời gian phản hồi chỉ tính bằng micro-giây.
  • Đa dạng cấu trúc dữ liệu: Hỗ trợ Strings, Hashes, Lists, Sets, Sorted Sets, Bitmaps, HyperLogLogs và Streams.
  • Persistence tùy chọn: Cho phép sao lưu xuống ổ đĩa thông qua RDB (Redis Database Snapshot) hoặc AOF (Append-Only File) để đảm bảo không mất dữ liệu khi khởi động lại.
  • High Availability & Scalability: Hỗ trợ Redis Sentinel (tự động chuyển đổi khi lỗi - Failover) và Redis Cluster (chia nhỏ dữ liệu - Horizontal Sharding).
  • Pub/Sub Messaging & Lua Scripting: Cho phép gửi nhận thông điệp theo mô hình xuất bản/đăng ký và thực thi kịch bản logic nguyên tử ngay trên server.

3. 6 Trường hợp sử dụng thực tế trong Web Development

3.1. Caching trang & Đối tượng (Object Caching)

Trong các framework như Next.js, Laravel hay WordPress, Redis được sử dụng làm lớp cache trung gian giữa ứng dụng và Database. Kết quả của các câu query nặng được lưu vào Redis với thời gian hết hạn (TTL - Time To Live) cụ thể.

bash
# Ví dụ: Lưu thông tin sản phẩm với TTL 3600 giây (1 giờ)
SETEX product:1042:details 3600 '{"name": "Mechanical Keyboard", "price": 120}'

3.2. Quản lý Session người dùng (User Session Management)

Với các ứng dụng phân tán (Microservices) hoặc nhiều server chạy song song phía sau Load Balancer, việc lưu session trong RAM của từng instance là không khả thi. Redis thường được dùng làm nơi lưu session tập trung cho tất cả các instance.

3.3. Giới hạn tần suất truy cập (API Rate Limiting & Throttling)

Ngăn chặn tấn công DDoS hoặc lạm dụng API bằng cách đếm số lượng request của mỗi IP trong một khoảng thời gian bằng lệnh INCR và EXPIRE.

3.4. Bảng xếp hạng thời gian thực (Real-time Leaderboards)

Nhờ cấu trúc Sorted Set (ZSET), việc xây dựng bảng xếp hạng điểm số trong game hoặc top sản phẩm bán chạy có thể thực hiện với độ phức tạp chỉ O(log(N)).

bash
# Thêm điểm số cho người chơi
ZADD game:leaderboard 2500 "player_1"
ZADD game:leaderboard 3100 "player_2"

# Lấy top 10 người chơi điểm cao nhất
ZREVRANGE game:leaderboard 0 9 WITHSCORES

3.5. Hệ thống hàng đợi (Queues & Job Workers)

Các tác vụ xử lý nền (gửi email, xử lý hình ảnh, xuất báo cáo) thường được đẩy vào queue trong Redis (sử dụng BullMQ trong Node.js hoặc Laravel Horizon/Queue) để xử lý bất đồng bộ.

3.6. Giao tiếp Thời gian thực & Chat (Pub/Sub)

Sử dụng mô hình Publish/Subscribe để truyền tin nhắn tức thì giữa các client kết nối WebSockets hoặc giữa các microservice.


4. So sánh Redis với Cơ sở dữ liệu truyền thống

Redis không thay thế MySQL hay PostgreSQL; hai loại này thường được dùng cùng nhau.

Tiêu chí Redis MySQL / PostgreSQL
Loại lưu trữ In-memory (RAM) Disk-based (Ổ đĩa SSD/HDD)
Tốc độ truy xuất Rất nhanh (dưới 1 ms) Trung bình (Tùy thuộc vào Index và Disk I/O)
Mô hình dữ liệu Key-Value & Cấu trúc dữ liệu nâng cao Bảng quan hệ (Relational Tables)
Độ phức tạp Query Đơn giản, truy xuất theo Key/Range SQL nâng cao (JOIN, Subquery, Aggregation)
Độ bền dữ liệu (Persistence) Tùy chọn (RDB / AOF) Tính năng cốt lõi (ACID compliant)
Khả năng mở rộng Rất cao (Redis Cluster) Trung bình (Read-Replica, Sharding phức tạp hơn)
Trường hợp sử dụng chính Caching, Sessions, Queue, Pub/Sub, Real-time Lưu trữ dữ liệu vĩnh viễn, giao dịch tài chính

5. Redis giúp gì cho hiệu năng website?

Tốc độ tải trang ảnh hưởng đến cả thứ hạng SEO lẫn tỷ lệ giữ chân người dùng. Redis giúp ở ba điểm:

  • Giảm tải cho Database Server: Khi phần lớn truy vấn đọc được trả từ cache, database không bị tình trạng quá tải CPU hay cạn kiệt connection pool trong giờ cao điểm.
  • Cải thiện Core Web Vitals: Thời gian phản hồi TTFB (Time to First Byte) giảm, nên trang hiển thị nhanh hơn.
  • Tiết kiệm chi phí hạ tầng: Một instance Redis nhỏ có thể xử lý hàng chục nghìn request mỗi giây, tiết kiệm việc phải scale theo chiều dọc các server cơ sở dữ liệu đắt đỏ.

6. Bảo mật và cấu hình Redis

Checklist khi triển khai

  1. Thiết lập mật khẩu mạnh: Sử dụng chỉ thị requirepass trong file redis.conf hoặc cấu hình Redis ACL (từ Redis 6+).
  2. Bind vào Private IP / Localhost: Chỉ cho phép kết nối nội bộ thông qua bind 127.0.0.1 hoặc trong cùng mạng VPC/Docker Network.
  3. Vô hiệu hóa các lệnh nguy hiểm: Đổi tên hoặc chặn các lệnh như FLUSHALL, FLUSHDB, CONFIG bằng chỉ thị rename-command trong file config.
  4. Bật mã hóa TLS: Khi truyền tải dữ liệu nhạy cảm qua mạng, hãy kích hoạt hỗ trợ TLS/SSL.
  5. Cấu hình chính sách giải phóng bộ nhớ (Eviction Policy): Đặt giới hạn maxmemory và chọn chính sách phù hợp như volatile-lru hoặc allkeys-lru để tự động xóa các key cũ khi RAM đầy.
  6. Theo dõi Memory & Hit/Miss Ratio: Thường xuyên kiểm tra hiệu quả của cache qua lệnh INFO stats và INFO memory.

7. Lời kết

Redis không chỉ dùng để cache. Cùng một công cụ có thể đảm nhận session, rate limiting, bảng xếp hạng và message queue. Nếu hệ thống của bạn đang nghẽn ở database, Redis thường là chỗ hợp lý để bắt đầu.

Bình luận