Redis
Trang này chứa các mẹo và tài nguyên để chuẩn bị cho các cuộc phỏng vấn Redis.
Dưới đây là 30 câu hỏi phỏng vấn về Redis từ cơ bản đến nâng cao, kèm theo câu trả lời chi tiết. Các câu hỏi được sắp xếp theo mức độ khó tăng dần để giúp bạn nắm vững kiến thức từ nền tảng đến chuyên sâu.
Câu hỏi cơ bản
Redis là gì?
Trả lời: Redis (Remote Dictionary Server) là một cơ sở dữ liệu NoSQL mã nguồn mở, hoạt động trong bộ nhớ (in-memory), được sử dụng để lưu trữ dữ liệu dạng key-value. Nó nhanh, nhẹ và hỗ trợ nhiều cấu trúc dữ liệu như strings, lists, sets, hashes, v.v.
Redis khác gì so với các cơ sở dữ liệu truyền thống như MySQL?
Trả lời: Redis là cơ sở dữ liệu in-memory, ưu tiên tốc độ, trong khi MySQL là cơ sở dữ liệu quan hệ lưu trữ trên đĩa. Redis không hỗ trợ SQL mà dùng key-value, phù hợp cho caching, session store, còn MySQL thích hợp cho dữ liệu có cấu trúc phức tạp.
Redis được sử dụng phổ biến trong trường hợp nào?
Trả lời: Redis thường được dùng cho caching, quản lý session, hàng đợi (queue), leaderboard, pub/sub messaging, và các ứng dụng yêu cầu truy cập dữ liệu nhanh.
Redis hỗ trợ những loại dữ liệu nào?
Trả lời: Redis hỗ trợ strings, lists, sets, sorted sets, hashes, bitmaps, hyperloglogs, geospatial indexes, và streams.
Làm thế nào để cài đặt Redis trên Linux?
Trả lời: Bạn có thể cài Redis bằng lệnh:
Sau đó, khởi động Redis bằng
sudo systemctl start redis
.
Lệnh cơ bản để đặt và lấy giá trị trong Redis là gì?
Trả lời:
Đặt giá trị:
SET key value
Lấy giá trị:
GET key
Redis có hỗ trợ persistence (lưu trữ lâu dài) không?
Trả lời: Có, Redis hỗ trợ persistence qua hai cơ chế: RDB (snapshot) và AOF (append-only file). RDB lưu snapshot định kỳ, còn AOF ghi lại mọi thao tác ghi.
TTL trong Redis là gì?
Trả lời: TTL (Time To Live) là thời gian sống của một key. Sau khi hết TTL, key sẽ tự động bị xóa. Dùng lệnh
EXPIRE key seconds
để đặt TTL.
Lệnh nào để kiểm tra thời gian sống còn lại của một key?
Trả lời: Lệnh
TTL key
trả về số giây còn lại, hoặc-1
nếu key không có TTL,-2
nếu key không tồn tại.
Redis có phải là single-threaded không?
Trả lời: Đúng, Redis chủ yếu hoạt động single-threaded cho các thao tác chính (I/O và xử lý lệnh), nhưng từ phiên bản 6.0, nó hỗ trợ multi-threading cho I/O để cải thiện hiệu suất.
Câu hỏi trung cấp
Redis Pub/Sub là gì?
Trả lời: Pub/Sub (Publish/Subscribe) là cơ chế nhắn tin trong Redis. Client có thể subscribe vào một channel (
SUBSCRIBE channel
) và nhận tin nhắn khi publisher gửi tin qua lệnhPUBLISH channel message
.
Làm thế nào để xóa một key trong Redis?
Trả lời: Dùng lệnh
DEL key
để xóa một key cụ thể. Nếu muốn xóa nhiều key, có thể dùngDEL key1 key2 key3
.
Redis hỗ trợ transaction như thế nào?
Trả lời: Redis dùng lệnh
MULTI
để bắt đầu transaction, sau đó thực hiện các lệnh, vàEXEC
để thực thi tất cả. Nếu muốn hủy, dùngDISCARD
. Tuy nhiên, nó không rollback như database quan hệ.
Sự khác biệt giữa RDB và AOF trong Redis là gì?
Trả lời:
RDB: Lưu snapshot toàn bộ dữ liệu tại một thời điểm, nhanh nhưng có thể mất dữ liệu giữa các snapshot.
AOF: Ghi lại mọi lệnh ghi, bền bỉ hơn nhưng chậm hơn và file lớn hơn.
Lệnh nào để thêm phần tử vào một list trong Redis?
Trả lời:
Thêm vào đầu:
LPUSH list value
Thêm vào cuối:
RPUSH list value
Redis Lua scripting là gì?
Trả lời: Redis hỗ trợ chạy script Lua bằng lệnh
EVAL
. Script Lua giúp thực hiện các logic phức tạp trong một lệnh duy nhất, giảm round-trip giữa client và server.
Làm thế nào để tăng hiệu suất Redis?
Trả lời: Sử dụng pipelining, cấu hình persistence phù hợp, dùng multi-threading (Redis 6+), tối ưu hóa bộ nhớ, và chọn cấu trúc dữ liệu phù hợp.
Redis Sentinel là gì?
Trả lời: Redis Sentinel là hệ thống giám sát và tự động chuyển đổi failover trong cụm Redis. Nó theo dõi master/slave, tự động chọn slave làm master nếu master bị lỗi.
Lệnh nào để lấy tất cả các key trong Redis?
Trả lời: Lệnh
KEYS pattern
(ví dụ:KEYS *
để lấy tất cả). Tuy nhiên, nên tránh dùng trong production vì nó chậm với database lớn.
Redis Cluster là gì?
Trả lời: Redis Cluster là giải pháp phân tán dữ liệu trên nhiều node, hỗ trợ sharding và high availability. Mỗi node quản lý một phần dữ liệu dựa trên hash slot (16384 slot).
Câu hỏi nâng cao
Redis xử lý sharding trong Cluster như thế nào?
Trả lời: Redis Cluster chia dữ liệu thành 16384 hash slot. Mỗi key được băm bằng CRC16 và gán vào một slot, sau đó slot được phân bổ cho các node.
Làm thế nào để cấu hình Redis Cluster?
Trả lời: Tạo nhiều instance Redis, sau đó dùng lệnh
redis-cli --cluster create
với danh sách IP:port của các node để thiết lập cluster, chỉ định master và slave.
Redis Streams là gì và khác gì với Pub/Sub?
Trả lời: Streams là cấu trúc dữ liệu (từ Redis 5.0) để lưu trữ và xử lý dữ liệu theo thời gian thực, hỗ trợ consumer groups. Pub/Sub chỉ gửi tin nhắn tức thời, không lưu trữ.
Lệnh nào để thêm dữ liệu vào Redis Streams?
Trả lời: Dùng
XADD stream_name * field value
để thêm một entry vào stream. Dấu*
tự động tạo ID dựa trên timestamp.
Redis có hỗ trợ locking không? Nếu có, làm thế nào?
Trả lời: Redis không có lock built-in, nhưng có thể dùng
SET key value NX EX seconds
để triển khai distributed lock (Redlock), đảm bảo chỉ một client giữ lock.
Tại sao Redis nhanh như vậy?
Trả lời: Redis nhanh vì lưu dữ liệu trong RAM, dùng single-threaded event loop, tối ưu hóa I/O, và hỗ trợ pipelining/multi-threading (Redis 6+).
Làm thế nào để xử lý khi Redis hết bộ nhớ?
Trả lời: Cấu hình
maxmemory
và chọn chính sách eviction (ví dụ: LRU, LFU) bằngmaxmemory-policy
nhưallkeys-lru
để tự động xóa key ít dùng.
Redis hỗ trợ replication như thế nào?
Trả lời: Redis dùng master-slave replication. Slave đồng bộ dữ liệu từ master bằng lệnh
REPLICAOF master_ip master_port
. Từ Redis 4.0, hỗ trợ partial resync (PSYNC).
Làm thế nào để giám sát hiệu suất Redis?
Trả lời: Dùng lệnh
INFO
để xem thống kê (memory, CPU, clients), hoặc công cụ như Redis Monitor, Prometheus + Grafana để theo dõi realtime.
Redlock là gì và cách triển khai?
Trả lời: Redlock là thuật toán distributed lock của Redis. Triển khai bằng cách:
Lấy lock trên nhiều instance (quá nửa số node).
Dùng
SET key value NX EX seconds
trên mỗi node.Nếu thành công trên đa số node, lock được giữ; nếu không, thử lại hoặc hủy.
Last updated