+2

Series Redis Thực chiến | Bài 1: Bức tranh toàn cảnh - Đừng dùng Redis chỉ để làm Cache!

Chào anh em, nếu anh em đang làm backend (đặc biệt là với Laravel, Node.js hay Golang), chắc chắn anh em đã từng gõ câu lệnh Cache::put('key', 'value') hoặc dùng Redis để lưu session. Thấy web chạy nhanh hơn, anh em vỗ tay ăn mừng và nghĩ rằng mình đã master Redis.

Nhưng thực tế, việc dùng Redis chỉ để lưu chuỗi string đơn giản (Key-Value) giống như anh em mua một chiếc siêu xe Ferrari chỉ để đi chợ mua rau vậy. Redis tự định nghĩa nó là một In-Memory Data Structure Store (Kho lưu trữ cấu trúc dữ liệu trên RAM).

Hôm nay, chúng ta sẽ bóc trần những sức mạnh ẩn giấu của Redis và xem tại sao các ông lớn công nghệ lại cuồng nó đến vậy.

1. Tại sao Redis lại nhanh đến mức "phi lý"?

Khác với MySQL hay PostgreSQL lưu dữ liệu trên ổ cứng (Disk), Redis lưu mọi thứ trên RAM. Tốc độ đọc/ghi của RAM nhanh hơn ổ cứng SSD hàng trăm đến hàng ngàn lần.

Tuy nhiên, bí mật thực sự làm nên tên tuổi của Redis nằm ở kiến trúc Single-Threaded (Đơn luồng). Nghe có vẻ vô lý đúng không? Tại sao thời đại CPU nhiều nhân mà Redis lại chạy đơn luồng?

  • Vì Redis chạy trên RAM, nút thắt cổ chai không nằm ở CPU mà nằm ở Network hoặc Memory.
  • Chạy đơn luồng giúp Redis loại bỏ hoàn toàn chi phí chuyển đổi ngữ cảnh (Context Switching) của CPU và các vấn đề hóc búa về Lock/Race Condition khi xử lý đồng thời.

Nhờ thiết kế này, một con server Redis bình thường có thể gánh tới hàng trăm ngàn request mỗi giây (QPS) một cách nhẹ tựa lông hồng.

2. Các cấu trúc dữ liệu "ăn tiền" của Redis

Redis không chỉ lưu chuỗi (String). Nó cung cấp sẵn các cấu trúc dữ liệu cực kỳ tối ưu, giúp anh em giải quyết các bài toán phức tạp chỉ bằng 1-2 dòng lệnh:

  • Hashes: Lưu trữ Object (giống mảng liên hợp trong PHP hay Object trong JS). Rất hợp để lưu thông tin User Profile, giỏ hàng.
  • Lists: Danh sách liên kết. Cực kỳ hoàn hảo để làm Message Queue (Hàng đợi) hoặc luồng Timeline mạng xã hội (Push/Pop cực nhanh).
  • Sets: Tập hợp các phần tử không trùng lặp. Tuyệt vời để đếm số lượng User truy cập duy nhất (Unique Visitors) hoặc làm tính năng "Bạn chung" (Mutual Friends) nhờ phép giao tập hợp.
  • Sorted Sets (ZSet): Tập hợp không trùng lặp nhưng được sắp xếp theo điểm số (Score). Đây là "trùm cuối" để làm bảng xếp hạng (Leaderboard) realtime cho game hoặc top sản phẩm bán chạy.

3. Những kịch bản "thực chiến" đỉnh cao của Redis

Ngoài việc làm Cache, anh em sẽ thấy Redis xuất hiện ở khắp mọi nơi trong một kiến trúc hệ thống hiện đại:

  1. Distributed Lock (Khóa phân tán): Khi hệ thống chạy trên nhiều server cùng lúc, làm sao để đảm bảo 2 request không trừ tiền của một user cùng một mili-giây? Redis cung cấp cơ chế Lock cực kỳ an toàn để giải quyết bài toán chống kẹt giao dịch này.
  2. Rate Limiting (Giới hạn truy cập): API của anh em bị spam liên tục? Chỉ với vài dòng code dùng Redis, anh em có thể giới hạn "Mỗi IP chỉ được gọi API 10 lần/phút", nếu quá sẽ block ngay lập tức ở tầng RAM trước khi nó kịp chạm vào Database.
  3. Pub/Sub (Giao tiếp thời gian thực): Redis đóng vai trò như một đài phát thanh. Một service "hét" lên, hàng tá service khác đang lắng nghe sẽ nhận được tín hiệu ngay lập tức. Cực kỳ hợp để làm Chat App hoặc bắn Notification.
  4. Quản lý Session & SSO: Nhờ tốc độ đọc cực nhanh, Redis là nơi hoàn hảo để lưu trữ Access Token, Blacklist Token khi làm hệ thống Single Sign-On.

Tổng kết Bài 1

Anh em thấy đấy, Redis là một cỗ máy đa năng. Việc hiểu rõ từng cấu trúc dữ liệu và áp dụng đúng kịch bản sẽ giúp hệ thống của anh em tăng tốc độ lên hàng chục lần, đồng thời giảm tải cực lớn cho Database chính.

Để thiết kế lộ trình cho Bài 2, bạn muốn chúng ta đi sâu vào code thực hành của bài toán Distributed Lock (chống double-click/trừ tiền trùng lặp) hay bài toán Rate Limiting (chống spam API) trước?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí