Cấu trúc dữ liệu của Redis: không chỉ là key-value

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Nhiều người biết Redis như một kho cache dạng khóa-giá trị. Thực ra sức mạnh của nó nằm ở chỗ giá trị không chỉ là chuỗi: Redis có nhiều cấu trúc dữ liệu sẵn, mỗi loại giải quyết gọn một lớp bài toán thường gặp. Biết chọn đúng cấu trúc giúp code đơn giản và nhanh hơn rất nhiều.

Redis là gì?

Redis là kho dữ liệu lưu trong bộ nhớ (in-memory), truy cập cực nhanh, có thể ghi ra đĩa để khôi phục sau khi khởi động lại. Bạn thao tác bằng các lệnh như SET, GET qua redis-cli hoặc thư viện của ngôn ngữ lập trình.

String: cái cơ bản nhất

SET greeting "xin chào"GET greetingSET session:abc123 "user:42" EX 3600   # hết hạn sau 3600 giâyINCR page:home:views                     # tăng đếm nguyên tửGET page:home:views

INCR là thao tác nguyên tử, nên nhiều tiến trình cùng tăng bộ đếm vẫn đúng, hợp để đếm lượt xem hoặc giới hạn tần suất. EX đặt thời gian sống, nền tảng của cache có hạn.

Hash: đối tượng nhiều trường

HSET user:42 name "An" email "an@example.com" age 25HGET user:42 nameHGETALL user:42HINCRBY user:42 age 1

Hash giống một từ điển nhỏ dưới một khóa, tiện cho việc lưu hồ sơ, cấu hình mà không phải tuần tự hóa cả đối tượng.

List: hàng đợi và dòng mới nhất

LPUSH queue:emails "job1"LPUSH queue:emails "job2"RPOP queue:emails        # lấy job cũ nhất ra xử lý (hàng đợi FIFO)LRANGE recent:posts 0 9  # 10 phần tử đầu

List phù hợp làm hàng đợi đơn giản hoặc lưu "10 hoạt động gần nhất". Có các lệnh chặn như BRPOP để worker chờ việc mới mà không phải hỏi liên tục.

Set: tập hợp không trùng

SADD tags:post:1 "php" "laravel" "redis"SISMEMBER tags:post:1 "php"SINTER tags:post:1 tags:post:2   # giao của hai tậpSCARD tags:post:1                 # số phần tử

Dùng set để theo dõi người dùng đã xem, thẻ chung giữa hai bài viết, hay bạn chung giữa hai người, nhờ các phép giao, hợp, hiệu.

Sorted Set: bảng xếp hạng

ZADD leaderboard 1500 "an" 2300 "binh" 1800 "chi"ZINCRBY leaderboard 100 "an"ZREVRANGE leaderboard 0 2 WITHSCORES   # top 3ZREVRANK leaderboard "an"

Mỗi phần tử có một điểm số và luôn được sắp xếp theo điểm. Đây là cấu trúc kinh điển cho bảng xếp hạng, hàng đợi có ưu tiên, hay lập lịch theo thời gian.

Một số cấu trúc khác

  • Bitmap và HyperLogLog: theo dõi hoạt động hằng ngày hoặc đếm số lượng khác nhau xấp xỉ với bộ nhớ rất nhỏ.
  • Stream: luồng sự kiện có nhóm tiêu thụ, dùng cho xử lý thông điệp.
  • Pub/Sub: phát và nhận thông điệp thời gian thực.

Quy ước đặt tên khóa và lưu ý

Đặt tên khóa có tiền tố phân cấp bằng dấu hai chấm như user:42:profile để dễ quản lý. Luôn đặt thời gian hết hạn cho dữ liệu tạm để tránh bộ nhớ phình ra. Tránh dùng lệnh KEYS * trên production vì nó quét toàn bộ và chặn server; hãy dùng SCAN. Vì Redis lưu trong RAM, hãy theo dõi mức dùng bộ nhớ và cấu hình chính sách loại bỏ (eviction) phù hợp với cách dùng cache của bạn.

Redis có thay thế được database chính không?

Câu trả lời thường là không, hoặc ít nhất là cần cân nhắc kỹ. Redis cực nhanh nhưng dữ liệu nằm trong bộ nhớ, dung lượng đắt hơn đĩa, và các cơ chế bền vững hóa (RDB, AOF) có những đánh đổi về an toàn dữ liệu. Với dữ liệu nghiệp vụ cốt lõi như đơn hàng, tài khoản, bạn vẫn nên giữ ở database quan hệ làm nguồn sự thật. Redis tỏa sáng ở vai trò hỗ trợ: cache, phiên đăng nhập, bộ đếm, hàng đợi, bảng xếp hạng, khóa phân tán. Thiết kế hệ thống sao cho nếu Redis mất dữ liệu thì ứng dụng vẫn khôi phục được từ nguồn chính là một nguyên tắc an toàn đáng nhớ.

Bài tập gợi ý

Hãy thử xây ba tính năng nhỏ chỉ bằng Redis: bộ đếm lượt xem bằng string, bảng xếp hạng bằng sorted set và hàng đợi gửi email bằng list. Hãy luôn kiểm tra lại bằng thực hành thay vì chỉ đọc lý thuyết: dựng một dự án nhỏ, cố tình tạo lỗi, quan sát log và công cụ gỡ lỗi, rồi sửa.

Kết luận

Redis giỏi nhất khi bạn chọn đúng cấu trúc: đếm bằng string, hồ sơ bằng hash, hàng đợi bằng list, tập duy nhất bằng set, xếp hạng bằng sorted set. Hãy cài Redis ở máy mình, mở redis-cli và thử từng lệnh trên, rồi nghĩ xem tính năng nào trong dự án của bạn có thể đơn giản hơn nhờ chúng.

Muốn học bài bản và có lộ trình rõ ràng? Bạn có thể xem các khóa học trên codebem.com.

author_photo
Nguyễn Đình Cường

0 comment