Bỏ qua điều hướng

Redis là gì? Kho dữ liệu in-memory cho cache và hàng đợi

Redis là kho dữ liệu in-memory hỗ trợ nhiều cấu trúc phức tạp, dùng làm cache và hàng đợi hiệu năng cao giúp tối ưu tốc độ truy xuất cho ứng dụng.

Tuan Tran Van
10 phút đọc
Mục lục (10 phần)
  1. Redis hoạt động như thế nào?
  2. Redis lưu được những kiểu dữ liệu nào?
  3. Dữ liệu có mất khi Redis khởi động lại?
  4. Người ta dùng Redis vào những việc gì?
  5. Cache bằng Redis thế nào cho đúng?
  6. Redis mở rộng và chịu lỗi ra sao?
  7. Redis khác Memcached ở điểm nào?
  8. Redis còn là mã nguồn mở không?
  9. Khi nào bạn nên dùng Redis?
  10. Tài liệu tham khảo

Redis (viết tắt của Remote Dictionary Server) là hệ thống lưu trữ cấu trúc dữ liệu in-memory mã nguồn mở

, được dùng như một cơ sở dữ liệu, bộ nhớ đệm (cache) và trình môi giới tin nhắn (message broker). Khác với các cơ sở dữ liệu truyền thống lưu dữ liệu trên ổ đĩa, Redis giữ toàn bộ tập dữ liệu trong RAM. Cách làm này loại bỏ thời gian tìm kiếm trên đĩa (seek time) — nút thắt cổ chai quen thuộc của hệ thống — và cho độ trễ dưới một phần nghìn giây (sub-millisecond).

Dự án được Salvatore Sanfilippo (biệt danh antirez) khởi xướng năm 2009, khi ông cần giải bài toán mở rộng cho một startup tại Ý. Redis viết bằng ngôn ngữ C, tối ưu cho các hệ thống POSIX như Linux và BSD. Thiết kế tinh gọn đó đưa Redis thành lựa chọn tiêu chuẩn cho các hệ thống xử lý dữ liệu thời gian thực và giảm tải cho cơ sở dữ liệu quan hệ (RDBMS).

Về bản chất, Redis là một server cấu trúc dữ liệu: bạn thao tác trực tiếp trên các kiểu dữ liệu trừu tượng thông qua giao thức mạng.

Thay vì chỉ cất giữ những chuỗi văn bản đơn giản, Redis xử lý các cấu trúc dữ liệu phức tạp ngay trên bộ nhớ chính — nhờ vậy logic ứng dụng gọn đi trông thấy.

Redis giữ toàn bộ dữ liệu trong RAM và trả kết quả dưới một phần nghìn giây

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

Cơ chế cốt lõi của Redis là vận hành hoàn toàn trên RAM. Nhờ đó, các thao tác đọc ghi đạt tốc độ hàng trăm nghìn request mỗi giây mà không vướng độ trễ của ổ cứng. Khi hệ thống khởi động lại, Redis nạp lại dữ liệu vào bộ nhớ từ các tệp sao lưu trên đĩa để khôi phục trạng thái.

Luồng xử lý lệnh đơn của Redis thao tác thẳng trên cấu trúc dữ liệu trong RAM, luồng phụ lo tác vụ nền

Về mặt kiến trúc, Redis dùng mô hình đơn luồng (single-threaded) cho việc xử lý lệnh chính. Lựa chọn này giúp Redis tránh được overhead của khóa dữ liệu (locking), tranh chấp tài nguyên (contention) và chuyển ngữ cảnh luồng (context switching). Từ các phiên bản sau, Redis bổ sung luồng phụ (background threads) cho những tác vụ nặng như ghi file AOF hay giải phóng vùng nhớ lớn, để chúng không chặn luồng xử lý chính.

Redis cũng không dùng query engine phân tích SQL. Mỗi lệnh gọi thẳng vào hàm thao tác trên cấu trúc dữ liệu nội bộ tương ứng, nên các lệnh cơ bản như SETGET diễn ra gần như tức thì:

bash
SET session:user:100 "active"
GET session:user:100
# Output: "active"

Redis lưu được những kiểu dữ liệu nào?

Redis không dừng ở mô hình Key-Value đơn thuần. Bạn có thể dùng Strings cho chuỗi byte hoặc bộ đếm, Hashes để lưu các object dạng field-value, Lists cho hàng đợi theo thứ tự chèn, Sets cho tập hợp không trùng lặp, và Sorted Sets để quản lý bảng xếp hạng dựa trên một điểm số (score) đi kèm.

Các kiểu dữ liệu Redis: Strings, Hashes, Lists, Sets, Sorted Sets cùng JSON, Vector sets, Time series và các kiểu xác suất

Từ phiên bản Redis 8.0, các tính năng nâng cao được hợp nhất vào lõi (core). Đáng chú ý là JSON, cho phép lưu trữ và truy vấn tài liệu phân cấp. Vector sets phục vụ trí tuệ nhân tạo (AI) và tìm kiếm tương đồng (similarity search) thông qua thuật toán HNSW, dùng các độ đo như Cosine Similarity để tìm trong không gian đa chiều. Ngoài ra còn có Time series cho dữ liệu dòng thời gian, và các kiểu dữ liệu xác suất (Probabilistic) như Bloom filter hay HyperLogLog — chúng kiểm tra sự tồn tại hoặc đếm phần tử duy nhất với mức chiếm dụng RAM cực thấp.

Mỗi kiểu dữ liệu có logic vận hành riêng: Streams hoạt động như một append-only log cho hệ thống hướng sự kiện, còn các cấu trúc xác suất đánh đổi độ chính xác tuyệt đối lấy hiệu quả lưu trữ. Chọn đúng kiểu dữ liệu quyết định phần lớn chuyện tiết kiệm bộ nhớ và giảm độ phức tạp thuật toán ở tầng ứng dụng.

Dữ liệu có mất khi Redis khởi động lại?

Redis cung cấp các cơ chế bền vững hóa (persistence) để bạn tự cân bằng giữa hiệu năng và an toàn dữ liệu:

  1. RDB (Snapshotting): Chụp ảnh tập dữ liệu tại một thời điểm và lưu vào tệp .rdb. Redis dùng cơ chế Copy-on-Write (CoW) thông qua lệnh fork() để tạo tiến trình con ghi dữ liệu ra đĩa, nhờ đó tiến trình chính vẫn phục vụ client bình thường. Đổi lại, nếu server crash giữa hai lần snapshot, bạn mất vài phút dữ liệu cuối cùng.
  2. AOF (Append Only File): Ghi lại mọi lệnh thay đổi dữ liệu vào nhật ký. Từ bản 7.0, cơ chế multi-part AOF (gồm base file và các incremental file) giúp quản lý việc ghi đĩa hiệu quả hơn.

Hai cơ chế bền vững hóa của Redis: RDB chụp ảnh tập dữ liệu còn AOF ghi nhật ký từng lệnh thay đổi

Từ phiên bản Redis 8.10.0, hệ thống có thêm nhóm lệnh BACKUP cho phép sao lưu online mà không cần dừng ghi hay tự tay quản lý AOF rewrite. Quy trình gồm BACKUP START (tạo BASE snapshot), BACKUP LIST (liệt kê các file đã ghim), BACKUP SEAL (đóng băng file INCR và manifest) và cuối cùng là BACKUP CLEANUP.

Cấu hình mẫu trong redis.conf:

conf
save 60 1000          # Snapshot sau 60s nếu có 1000 thay đổi
appendonly yes        # Bật AOF
appendfsync everysec  # Ghi AOF xuống đĩa mỗi giây (mất tối đa 1s dữ liệu)

Người ta dùng Redis vào những việc gì?

Phổ biến nhất là Caching — full page cache, session storage — để giảm tải cho database phía sau. Trong các hệ thống microservices, Redis đóng vai trò Message Broker thông qua Lists, Streams hoặc mô hình Pub/Sub. Redis xuất hiện ở gần như mọi ngành: công ty công nghệ, tổ chức tài chính, nền tảng game, thương mại điện tử và cả y tế.

Các việc Redis đảm nhận: cache, message broker, bảng xếp hạng, phân tích thời gian thực và tìm kiếm vector

Ở mảng thời gian thực, Redis được dùng để xây Leaderboards bằng Sorted Sets, hoặc Real-time Analytics bằng Bitfields và HyperLogLog. Với các kiểu dữ liệu Vector mới, Redis còn tham gia vào các hệ thống gợi ý và tìm kiếm ngữ nghĩa — nơi tốc độ phản hồi tính bằng mili giây là điều kiện tiên quyết.

Cache bằng Redis thế nào cho đúng?

Cache hiệu quả đòi hỏi bạn chọn giữa hai chiến lược: Lazy caching (Cache-aside) — chỉ nạp dữ liệu khi có người cần, tiết kiệm RAM; và Write-through — cập nhật cache song song với database để giữ tính nhất quán.

So sánh chiến lược cache-aside với write-through, kèm kỹ thuật cộng jitter vào TTL

Bạn luôn luôn phải đặt TTL (Time-to-live), nếu không cache sẽ đầy rác. Một kỹ thuật đáng giá là cộng thêm một lượng thời gian ngẫu nhiên (Jitter) vào TTL để tránh hiện tượng "thundering herd" (hay dog piling) — khi hàng loạt key hết hạn cùng lúc và dồn tải xuống database. Khi bộ nhớ đầy, hãy chọn chính sách thu hồi (Eviction policy) phù hợp: allkeys-lru (xóa key ít dùng gần nhất) là lựa chọn phổ biến nhất. Còn nếu dữ liệu của bạn là tối quan trọng, dùng no-eviction — Redis sẽ chặn mọi lệnh ghi mới để bảo toàn dữ liệu hiện có cho đến khi bộ nhớ được giải phóng.

Trước khi đưa một node mới vào hệ thống, hãy prewarming cache — nạp sẵn dữ liệu nóng bằng script. Bỏ qua bước này, database sẽ lãnh trọn cú sốc tải trong giai đoạn node mới còn trống.

Redis mở rộng và chịu lỗi ra sao?

Redis mở rộng thông qua mô hình Master-Replica, nơi dữ liệu từ Master được đồng bộ bất đồng bộ (asynchronous replication) sang các bản sao. Muốn nhất quán cao hơn, bạn có thể dùng lệnh WAIT — nhưng nó vẫn không đảm bảo strong consistency trong các kịch bản lỗi mạng phức tạp.

Kiến trúc Master-Replica và Redis Cluster chia 16.384 hash slot, Replica tự lên thay khi Master lỗi

Redis Cluster là giải pháp mở rộng hàng ngang, chia dữ liệu vào 16.384 hash slot trên nhiều node. Cluster tự duy trì hoạt động nhờ cơ chế bầu chọn: nếu một Master lỗi, Replica sẽ tự động lên thay. Một chi tiết dễ bỏ sót là Cluster Bus Port (thường là port chính cộng 10.000, ví dụ 16379), dùng giao thức nhị phân để các node trao đổi trạng thái và phát hiện lỗi. Bạn phải mở port này trong firewall thì Cluster mới chạy được.

Redis khác Memcached ở điểm nào?

Memcached hướng tới sự tối giản: đa luồng (multi-threaded) và chỉ hỗ trợ kiểu dữ liệu String. Redis đi theo hướng ngược lại — một hệ sinh thái dữ liệu đầy đủ.

Tiêu chíMemcachedRedis
Kiểu dữ liệuChỉ StringsStrings, Hashes, Lists, JSON, Vectors...
PersistenceKhông (dữ liệu mất khi tắt)RDB, AOF, BACKUP (8.10)
Luồng xử lýMulti-threadedSingle-threaded (main loop)
Mở rộngClient-side shardingMaster-Replica, Redis Cluster
Tính năngĐơn giản, chỉ cachePub/Sub, Transactions, Lua Scripting, Search

Redis còn là mã nguồn mở không?

Lịch sử giấy phép của Redis có vài khúc quanh. Từ giấy phép BSD mở, tháng 3/2024 Redis Ltd. chuyển sang dual-license (RSALv2/SSPL) nhằm chặn các nhà cung cấp đám mây lớn khai thác dự án mà không đóng góp lại. Quyết định đó dẫn tới sự ra đời của các nhánh fork như Valkey (thuộc Linux Foundation).

Dòng thời gian giấy phép Redis: BSD, chuyển sang RSALv2/SSPL năm 2024 và bổ sung AGPLv3 năm 2025

Đến phiên bản Redis 8.0 (tháng 5/2025), dự án bổ sung giấy phép AGPLv3 — một giấy phép được Open Source Initiative công nhận. Cùng lúc, toàn bộ tính năng từ Redis Stack (JSON, Search, Vector) được gộp vào một gói duy nhất dưới AGPLv3. Nói ngắn gọn: Redis hiện được cấp phép theo bộ ba RSALv2 / SSPLv1 / AGPLv3, và bạn được quyền chọn.

Khi nào bạn nên dùng Redis?

Dùng Redis khi bạn cần tốc độ phản hồi cực nhanh cho tập dữ liệu vừa và nhỏ, hoặc khi cần cấu trúc dữ liệu phức tạp để xử lý logic ngay tại lớp lưu trữ — xếp hạng, hàng đợi, đếm thời gian thực.

Đừng chọn Redis nếu dữ liệu của bạn lớn tới mức chi phí RAM không kham nổi, hoặc nếu ứng dụng đòi tính nhất quán tuyệt đối kiểu giao dịch ngân hàng. Trong những trường hợp đó, hãy để RDBMS làm nguồn dữ liệu chính và dùng Redis như một lớp cache bổ trợ.

Tài liệu tham khảo

Chia sẻ bài viết

X / TwitterFacebookLinkedIn