Là một trong những cơ sở dữ liệu trong bộ nhớ phổ biến nhất hiện nay, Redis đã trở thành công cụ không thể thiếu để tối ưu hóa tốc độ xử lý phía máy chủ. Vậy điều gì khiến Redis nhanh đến vậy? Và tại sao Redis chỉ sử dụng một luồng đơn nhưng vẫn đạt được hiệu suất vượt trội? Những câu hỏi này sẽ được giải đáp trong bài viết hôm nay.
Chúng ta sẽ cùng khám phá 5 vai trò phổ biến nhất của Redis trong các hệ thống.
Bộ nhớ đệm (Cache)
Kịch bản ứng dụng đầu tiên của Redis là Redis được sử dụng làm đối tượng bộ đệm để tăng tốc truy cập vào các ứng dụng web.
Trong nhiều trường hợp, một số dữ liệu trong cơ sở dữ liệu sẽ được truy cập thường xuyên. Khi tần suất truy cập tăng cao, tải trọng lên cơ sở dữ liệu cũng tăng theo, dẫn đến tình trạng phản hồi của ứng dụng bị chậm đi do tốc độ IO của cơ sở dữ liệu thường thấp. Trong tình huống này, việc sử dụng Redis để lưu trữ những dữ liệu truy cập thường xuyên có thể giúp giảm tải hiệu quả cho cơ sở dữ liệu chính và cải thiện đáng kể tốc độ phản hồi của ứng dụng.
Lưu trữ phiên (Session)
Việc sử dụng Redis để lưu trữ dữ liệu phiên cho phép bạn dễ dàng chia sẻ trạng thái người dùng giữa các máy chủ không trạng thái. Khi người dùng đăng nhập vào ứng dụng web, dữ liệu phiên được lưu trữ trong Redis, và một ID phiên duy nhất (Session ID) được gửi trở lại dưới dạng cookie trên trình duyệt của người dùng. Khi người dùng gửi yêu cầu đến ứng dụng, ID phiên này sẽ được kèm theo trong yêu cầu. Máy chủ web không trạng thái sẽ tìm kiếm dữ liệu phiên liên quan từ Redis dựa trên ID phiên này để xử lý yêu cầu tiếp theo.
Khóa phân tán (Distributed Lock)
Là một cơ chế đồng bộ hóa trong các hệ thống phân tán, đảm bảo rằng chỉ có một tiến trình hoặc thread duy nhất có thể truy cập và sửa đổi một tài nguyên chia sẻ tại một thời điểm nhất định.
Redis là một lựa chọn phổ biến để thực hiện Distributed Lock nhờ vào tốc độ, tính linh hoạt và các lệnh chuyên dụng. Hãy cùng phân tích chi tiết hơn về cách Redis hoạt động trong ngữ cảnh này.
Cơ chế hoạt động cơ bản
-
Đặt khóa:
- SETNX: Lệnh
SETNX
(SET if Not Exists) sẽ đặt một khóa mới chỉ khi khóa đó chưa tồn tại. Nếu đặt thành công, khóa sẽ có một thời gian sống (TTL) nhất định. - GETSET: Lệnh này sẽ lấy giá trị hiện tại của một khóa và đồng thời đặt một giá trị mới. Nếu khóa chưa tồn tại, nó sẽ được tạo mới.
- SETNX: Lệnh
-
Kiểm tra và giải phóng khóa:
- Tiến trình sẽ thường xuyên kiểm tra xem khóa có còn hiệu lực hay không. Nếu khóa đã hết hạn hoặc bị một tiến trình khác giải phóng, tiến trình hiện tại có thể tiếp tục thực hiện công việc.
- Lua Scripting: Redis cung cấp khả năng thực thi các script Lua để thực hiện các thao tác phức tạp một cách nguyên tử. Điều này rất hữu ích trong việc kiểm tra và giải phóng khóa một cách an toàn.
Giới hạn tốc độ (Rate Limiter)
Rate Limiter là một cơ chế kiểm soát tốc độ truy cập vào một dịch vụ hoặc tài nguyên cụ thể. Nó đặt ra giới hạn về số lượng yêu cầu mà một client (khách hàng) có thể gửi đến server (máy chủ) trong một khoảng thời gian nhất định.
Tại sao cần Rate Limiter?
- Bảo vệ server khỏi quá tải: Ngăn chặn server bị quá tải bởi lượng yêu cầu quá lớn, dẫn đến chậm trễ hoặc sập máy.
- Ngăn chặn các cuộc tấn công DDoS: Giảm thiểu thiệt hại từ các cuộc tấn công phân tán từ chối dịch vụ.
- Phân phối tài nguyên một cách công bằng: Đảm bảo rằng tất cả các client đều có cơ hội truy cập dịch vụ.
- Thực thi chính sách sử dụng: Đặt ra các giới hạn sử dụng khác nhau cho các loại client khác nhau.
Để hiểu rõ hơn về cách Redis hoạt động trong việc giới hạn tốc độ, chúng ta hãy cùng xem một ví dụ cụ thể.
Giả sử:
- Chúng ta có một API cho phép người dùng đăng nhập.
- Mỗi người dùng chỉ được phép đăng nhập tối đa 5 lần trong vòng 1 phút.
Cách thực hiện với Redis:
-
Tạo key:
- Khi một người dùng gửi yêu cầu đăng nhập, hệ thống sẽ tạo một key trong Redis với định dạng
user:username:rate_limit
. - Giá trị của key này ban đầu là 0.
- Khi một người dùng gửi yêu cầu đăng nhập, hệ thống sẽ tạo một key trong Redis với định dạng
-
Tăng giá trị key:
- Mỗi khi có một yêu cầu đăng nhập, hệ thống sẽ tăng giá trị của key tương ứng lên 1 bằng lệnh
INCR
.
- Mỗi khi có một yêu cầu đăng nhập, hệ thống sẽ tăng giá trị của key tương ứng lên 1 bằng lệnh
-
Kiểm tra giới hạn:
- Sau khi tăng giá trị, hệ thống sẽ kiểm tra xem giá trị hiện tại của key có vượt quá giới hạn 5 hay không.
- Nếu vượt quá, yêu cầu sẽ bị từ chối và trả về thông báo lỗi.
-
Xóa key cũ:
- Định kỳ, hệ thống sẽ xóa các key đã hết hạn (ví dụ, sau 1 phút) để giải phóng bộ nhớ.
Xây dựng hệ thống xếp hạng (Rank/Leaderboard)
Redis, với khả năng lưu trữ dữ liệu trong bộ nhớ và tốc độ truy xuất cực nhanh, là một lựa chọn tuyệt vời để xây dựng các hệ thống xếp hạng (Rank/Leaderboard) theo thời gian thực.
Các trường hợp sử dụng phổ biến
- Game: Xếp hạng người chơi theo điểm số, cấp độ.
- Mạng xã hội: Xếp hạng người dùng theo số lượng follower, bài đăng.
- E-commerce: Xếp hạng sản phẩm theo số lượng bán ra, đánh giá.
- Ứng dụng tin tức: Xếp hạng bài viết theo số lượt xem, bình luận.