Redis là một hệ thống cơ sở dữ liệu in-memory nổi bật, không chỉ nhờ hiệu năng truy xuất cực nhanh mà còn bởi khả năng xử lý linh hoạt với nhiều cấu trúc dữ liệu. Để khai thác tối đa sức mạnh của Redis, ta cần hiểu và sử dụng thành thạo các Redis command từ những lệnh cơ bản đến các lệnh nâng cao.
Đọc bài viết này để hiểu rõ:
- Các cách thực thi Redis command
- Cách sử dụng từng lệnh Redis (có ví dụ minh họa)
- Một số kịch bản dùng lệnh Redis torng thực tế
Tổng quan về Redis
Redis (Remote Dictionary Server) là một hệ thống cơ sở dữ liệu key-value dạng in-memory, mã nguồn mở, nổi tiếng với tốc độ truy xuất cực nhanh. Redis thường được dùng để làm cache, quản lý session, xử lý hàng đợi, lưu trữ dữ liệu tạm thời, truyền và nhận thông điệp giữa các thành phần trong hệ thống (pub/sub messaging), xây dựng bảng xếp hạng (leaderboards), phân tích dữ liệu theo thời gian thực (real-time analytics) và hỗ trợ các hệ thống yêu cầu phản hồi nhanh chóng.
Đọc thêm: Redis là gì: Tổng hợp tính năng hữu ích nhất của Redis
Không giống các hệ quản trị cơ sở dữ liệu quan hệ (như MySQL), Redis lưu trữ dữ liệu trong bộ nhớ RAM, giúp các thao tác đọc/ghi diễn ra gần như tức thời. Tuy nhiên, Redis cũng hỗ trợ cơ chế lưu trữ bền vững (persistence) để ghi dữ liệu xuống đĩa cứng để tránh mất mát trong trường hợp hệ thống gặp sự cố. Hai phương pháp phổ biến là:
- RDB (Redis Database snapshot) chụp nhanh toàn bộ dữ liệu định kỳ
- AOF (Append Only File) ghi lại từng thao tác ghi dữ liệu để có thể phục hồi chính xác trạng thái trước đó.
Ngoài ra, Redis hỗ trợ nhiều kiểu dữ liệu đa dạng như:
- Strings: kiểu dữ liệu cơ bản.
- Lists: danh sách có thứ tự.
- Sets: tập hợp không trùng lặp.
- Sorted Sets: tập hợp có thứ tự theo điểm số.
- Hashes: bảng băm (key-value lồng nhau).
- Bitmaps, HyperLogLogs: phục vụ tính toán số lượng phần tử duy nhất với chi phí thấp.
- Geospatial Indexes: lưu trữ và truy vấn theo vị trí địa lý.
- Streams: quản lý dữ liệu luồng theo thời gian.
Redis command là gì?
Redis hoạt động chủ yếu thông qua các lệnh (commands) được gửi qua giao thức TCP hoặc Unix socket. Mỗi thao tác từ lưu dữ liệu, đọc dữ liệu, đến cấu hình hệ thống đều được thực hiện thông qua câu lệnh Redis.
Có thể thực thi Redis command bằng nhiều cách:
- Dòng lệnh (redis-cli): công cụ CLI mặc định đi kèm Redis.
- Từ ứng dụng: sử dụng client library như ioredis, node-redis (Node.js), redis-py (Python), Jedis (Java), StackExchange.Redis (.NET),…
- Thông qua UI trực quan như RedisInsight, Redis Commander để quan sát dữ liệu và gửi lệnh dễ dàng.
Tổng hợp Redis commands
Nhóm lệnh thao tác với key-value (cơ bản)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
SET key value [EX seconds] [NX|XX] | Dùng để lưu giá trị cho một key; nếu key đã tồn tại thì giá trị sẽ bị ghi đè. – EX seconds : thiết lập thời gian sống (expire time) cho key, tính bằng giây.– NX : chỉ thực hiện nếu key chưa tồn tại (thường dùng trong cơ chế locking để tránh ghi đè).– XX : chỉ thực hiện nếu key đã tồn tại (dùng để cập nhật có điều kiện). | Lưu tên người dùng:SET user:name "Alice" → Lưu chuỗi “Alice” vào key user:name. Nếu key chưa tồn tại, Redis sẽ tạo mới. SET session:token "abc123" EX 3600 NX |
GET key | Truy xuất giá trị đã lưu từ key và trả về nil nếu key không tồn tại. | Lấy tên đã lưu:GET user:name → Trả về “Alice” nếu key tồn tại. |
DEL key [key ...] | Xóa một hoặc nhiều key khỏi Redis. Trả về số lượng key đã xóa thành công. | Xoá tên đã lưu:DEL user:name Xóa nhiều key: DEL user:name user:email user:age |
EXPIRE key seconds | Thiết lập thời gian sống cho một key (tính bằng giây). Sau thời gian này, key sẽ tự động bị xóa. | Thiết lập thời gian sống cho key:EXPIRE session:123 3600 → Sau 60 giây, key user:name sẽ bị Redis tự động xóa. |
TTL key | Kiểm tra thời gian còn lại (tính bằng giây) trước khi key hết hạn. Trả về -1 nếu key không có expire, -2 nếu key không tồn tại. | TTL session:123 → Trả về số giây còn lại hoặc -1/-2 |
SETEX key seconds value | Thiết lập giá trị và thời gian hết hạn cho key trong một bước. | SETEX session:token 3600 "abc123" → Lưu giá trị “abc123” vào key session:token và thiết lập thời gian sống cho key là 3600 giây. |
PSETEX key milliseconds value | Thiết lập giá trị và thời gian hết hạn cho key tính bằng millisecond. | PSETEX session:token 3600000 "abc123" → Lưu giá trị “abc123” vào key session:token và thiết lập thời gian sống cho key là 3600000 milliseconds (60 phút). |
SETNX key value | Thiết lập giá trị cho key nếu key chưa tồn tại. | SETNX user:name "Alice" → Lệnh này chỉ thực hiện nếu key user:name chưa tồn tại. |
ARRAPPEND key value [value ...] | Thêm phần tử vào cuối mảng (array) trong key. | ARRAPPEND arr1 "value1" "value2" → Thêm các phần tử “value1”, “value2” vào cuối mảng arr1. |
ARRINDEX key value | Trả về chỉ số của một phần tử trong mảng (array) của key. | ARRINDEX arr1 "value1" → Trả về chỉ số của phần tử “value1” trong mảng arr1. |
Nhóm lệnh thao tác với số và chuỗi
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
INCR key | Tăng giá trị số nguyên của key lên 1. Nếu key chưa tồn tại, Redis sẽ khởi tạo nó với giá trị 0 rồi tăng. | Tạo bộ đếm lượt truy cập:INCR page:views → Redis sẽ tăng giá trị tại key page:views thêm 1. Nếu key chưa tồn tại, nó sẽ được tạo và khởi tạo bằng 1. |
DECR key | Giảm giá trị số nguyên của key đi 1. | DECR page:views |
STRLEN key | Trả về độ dài chuỗi giá trị của key. | STRLEN msg → Trả về 6 nếu msg = “Hello!“. |
APPEND key value | Thêm chuỗi vào cuối giá trị hiện tại của key. | APPEND msg "!" → Nếu key = “Hello”, kết quả là “Hello!”. |
MGET key [key ...] | Trả về giá trị của nhiều keys cùng một lúc. | MGET user:name user:email → Trả về giá trị của các key user:name và user:email nếu chúng tồn tại. |
Nhóm lệnh thao tác với danh sách (List)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
LPUSH key value [value ...] | Thêm phần tử vào đầu danh sách. Nếu key chưa tồn tại, Redis sẽ tạo mới. | Thêm công việc vào hàng đợi:LPUSH tasks "email" → Redis sẽ thêm công việc vào đầu danh sách, trong đó:– tasks là danh sách hàng đợi– “ send-email ” là công việc mới. |
RPUSH key value [value ...] | Thêm một phần tử vào cuối của danh sách. | Thêm công việc vào cuối hàng đợi:LPUSH job:queue "send-email" Trong đó: – job:queue : tên danh sách– “ send-email “: công việc cần xử lý→ Redis sẽ thêm “ send-email ” vào đầu danh sách. Các phần tử mới sẽ xếp sau các phần tử cũ. Thích hợp cho kiểu xử lý FIFO (First In – First Out) |
LPOP key [count] | Lấy và loại bỏ phần tử ở đầu danh sách. Có thể lấy nhiều phần tử cùng lúc với tham số count. | Lấy công việc tiếp theo:LPOP tasks LPOP tasks 3 (lấy 3 phần tử) → Lấy và xóa phần tử đầu tiên trong danh sách. |
LRANGE key start stop | Truy vấn một phạm vi phần tử từ danh sách, với chỉ số bắt đầu và kết thúc. | LRANGE tasks 0 2 → Trả về các phần tử trong danh sách tasks từ chỉ số 0 đến chỉ số 2 (bao gồm cả chỉ số 0 và 2). |
Nhóm lệnh thao tác với bảng băm (Hash)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
HSET key field value | Gán một field trong bảng hash (giống như object JSON). | Lưu thông tin người dùng dạng object:HSET user:1 name "Alice" → Tạo bảng hash user:1, gán field name là “Alice“. |
HGET key field | Lấy giá trị field từ hash. | HGET user:1 name → Trả về “Alice” |
HDEL key field [field ...] | Xóa một hoặc nhiều trường trong bảng hash. | HDEL user:1 age → Xóa trường age trong bảng hash user:1. |
HGETALL key | Lấy tất cả các trường và giá trị của một bảng hash. | HGETALL user:1 → Trả về tất cả các trường và giá trị trong bảng hash user:1. |
HINCRBY key field increment | Tăng giá trị của một trường trong bảng hash. | HINCRBY user:1 age 1 → Tăng giá trị của trường age trong bảng hash user:1 lên 1. |
Nhóm lệnh thao tác với tập hợp (Set)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
SADD key value | Thêm phần tử vào tập hợp (set), không thêm nếu phần tử đã tồn tại. | Tạo danh sách tag không trùng lặp:SADD tags "redis" → Thêm “redis” vào tập hợp tags. Nếu “redis” đã có thì không thêm lại. |
SISMEMBER key value | Kiểm tra xem phần tử có trong tập hợp không. | SISMEMBER tags "redis" → Trả về 1 nếu “redis” có trong tập, 0 nếu không. |
SPOP key [count] | Lấy và xóa một hoặc nhiều phần tử ngẫu nhiên từ tập hợp. | SPOP tags 2 → Lấy và xóa 2 phần tử ngẫu nhiên từ tập hợp tags. |
SMEMBERS key | Lấy tất cả các phần tử trong một tập hợp. | SMEMBERS tags → Trả về tất cả các phần tử trong tập hợp tags. |
SDIFF key1 key2 [key3 ...] | Trả về phần tử chỉ có trong tập hợp đầu tiên nhưng không có trong các tập hợp còn lại. | SDIFF tags other_tags → Trả về phần tử trong tập hợp tags mà không có trong tập hợp other_tags. |
Nhóm lệnh thao tác với Sorted Set (ZSet)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
ZADD key score member | Thêm phần tử vào sorted set kèm điểm số (dùng để sắp xếp). | Tạo bảng xếp hạng:ZADD leaderboard 1500 "player1" → Thêm “player1” với điểm 1500 vào sorted set leaderboard. |
ZRANGE key start stop [WITHSCORES] | Truy xuất các phần tử theo thứ tự điểm từ thấp đến cao. | ZRANGE leaderboard 0 -1 WITHSCORES → Lấy toàn bộ danh sách theo thứ tự từ thấp đến cao kèm điểm. |
ZREM key member [member …] | Xóa một hoặc nhiều phần tử khỏi sorted set. | ZREM leaderboard “player1″→ Xóa phần tử “player1” khỏi sorted set leaderboard. |
ZINCRBY key increment member | Tăng điểm của một phần tử trong sorted set. | ZINCRBY leaderboard 10 "player1" → Tăng điểm của phần tử “player1” trong sorted set leaderboard lên 10. |
Nhóm lệnh thao tác với Stream (dữ liệu luồng)
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
XADD key ID field value [field value ...] | Thêm một mục vào stream (dòng) Redis. | XADD mystream * sensor-id 1234 temperature 19 → Thêm mục mới vào stream mystream với ID tự động và các trường sensor-id và temperature. |
XREAD key [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] | Đọc từ stream Redis. Lệnh này thường dùng trong hệ thống thời gian thực (real-time). | XREAD COUNT 2 BLOCK 0 STREAMS mystream → Đọc các mục từ stream mystream, trả về 2 mục đầu tiên, và chặn cho đến khi có mục mới nếu cần. |
Nhóm lệnh Pub/Sub và Transaction
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
PUBLISH channel message | Gửi một tin nhắn đến một kênh. | PUBLISH news "Hello, Redis!" → Gửi tin nhắn “Hello, Redis!” đến kênh news. |
SUBSCRIBE channel [channel ...] | Đăng ký để nhận tin nhắn từ một kênh. | SUBSCRIBE news → Đăng ký để nhận tất cả tin nhắn từ kênh news. |
MULTI | Bắt đầu một giao dịch Redis, được thực thi sau khi gọi lệnh EXEC | |
EXEC | Thực thi các lệnh trong giao dịch đã bắt đầu với lệnh MULTI . | |
DISCARD | Hủy bỏ giao dịch. |
Nhóm lệnh quản trị và quan sát hệ thống
Cú pháp lệnh | Mô tả chi tiết | Ví dụ lệnh |
SCAN cursor [MATCH pattern] [COUNT count] | Duyệt qua các keys trong Redis theo cách không đồng bộ, giúp tránh chặn Redis. | SCAN 0 MATCH user:* COUNT 100 → Tìm kiếm tất cả các keys bắt đầu với “user:” và giới hạn kết quả là 100 keys. |
INFO | Trả về thông tin về Redis server. | |
MONITOR | Giám sát tất cả các lệnh được gửi đến Redis server. |
6 ví dụ thực tế dùng Redis command hiệu quả
Cache dữ liệu API để tăng tốc độ phản hồi
Trong các ứng dụng hiện đại, dữ liệu thường được lấy từ API bên ngoài (thời tiết, tỷ giá, dữ liệu thị trường,…). Nếu mỗi lần người dùng thao tác đều phải gọi API thì ứng dụng sẽ chậm và dễ bị rate limit.
Giải pháp là cache kết quả tạm thời trong Redis. Ví dụ để cache dữ liệu API trong 5 phút, ta dùng:
GET weather:saigon
# Nếu chưa có, gọi API rồi:
SET weather:saigon "{temp:31}" EX 300
=> Dữ liệu được lưu vào Redis với key weather:saigon
, thời hạn 300 giây. Lần truy cập sau chỉ cần GET
, không cần gọi lại API.
Mẹo: Nên áp dụng quy tắc đặt tên (naming convention) nhất quán cho các key trong Redis, ví dụ: api:weather:saigon
. Ngoài ra, bạn cũng có thể triển khai các chiến lược như cache warming (tự động nạp sẵn dữ liệu phổ biến vào cache sau khi khởi động hệ thống) và cache invalidation (làm mới hoặc xóa cache khi dữ liệu gốc thay đổi) để đảm bảo hiệu suất và tính nhất quán dữ liệu.
Lưu phiên đăng nhập người dùng (Session Store)
Khi người dùng đăng nhập, hệ thống thường cần lưu trạng thái đăng nhập tạm thời (token, userID,…). Redis là nơi lưu session lý tưởng vì tốc độ cao và hỗ trợ TTL.
Ví dụ để lưu session có thời hạn 1 giờ, ta dùng:
SET session:abc123 "userId:42"
EXPIRE session:abc123 3600
=> Session abc123
lưu thông tin người dùng, sau 3600 giây sẽ tự hết hạn. Phù hợp cho các hệ thống cần logout tự động hoặc chống session rác.
Mẹo: Khi cần lưu trữ dữ liệu phiên (session) có cấu trúc phức tạp, bạn nên sử dụng lệnh HSET
. Redis Hash cho phép lưu nhiều cặp trường–giá trị (field–value) trong cùng một key, giúp bạn dễ dàng cập nhật từng phần của session mà không cần ghi đè toàn bộ dữ liệu.
Tạo hàng đợi xử lý công việc nền (Job Queue)
Trong các hệ thống như gửi email, resize ảnh, xử lý đơn hàng…, các tác vụ thường chạy nền và cần được xử lý lần lượt. Redis list kết hợp LPUSH và LPOP là một giải pháp đơn giản và hiệu quả.
Ví dụ để push và pop công việc từ hàng đợi:
LPUSH job:queue "send-email"
LPOP job:queue
=> LPUSH thêm công việc mới vào hàng đợi; LPOP
lấy ra công việc đầu tiên để xử lý. Dễ tích hợp với worker chạy song song.
Mẹo: Dùng BLPOP
để tránh polling liên tục, giúp tiết kiệm CPU vì worker chỉ “thức dậy” khi có dữ liệu và có thể triển khai hàng đợi ưu tiên bằng cách dùng nhiều list.
Tạo bảng xếp hạng người chơi (Leaderboard)
Khi cần xếp hạng người dùng theo điểm số (ví dụ game, thi đua, KPI…), Redis Sorted Set giúp lưu và truy vấn dữ liệu đã sắp xếp rất nhanh.
Ví dụ để thêm người chơi vào leaderboard và xem bảng xếp hạng:
ZADD leaderboard 2000 "playerA"
ZADD leaderboard 3200 "playerB"
ZRANGE leaderboard 0 -1 WITHSCORES
=> Redis sắp xếp theo điểm (score
), cho phép lấy danh sách top theo thứ tự tăng dần (hoặc dùng ZREVRANGE
để lấy top giảm dần).
Mẹo: Dùng ZREVRANGE
để lấy danh sách xếp hạng từ cao xuống (top list), ZRANK
hoặc ZREVRANK
để biết vị trí của một user. Có thể tạo nhiều bảng xếp hạng (leaderboard) tương ứng với từng khoảng thời gian khác nhau như ngày, tuần, tháng.
Đếm lượt truy cập trang (Page Views Counter)
Đếm số lượt xem trang là tính năng rất phổ biến. Redis hỗ trợ INCR
để tăng số nguyên nhanh, gọn mà không cần read-modify-write như database truyền thống.
Ví dụ để tăng lượt truy cập mỗi lần trang được truy cập:
INCR page:homepage
=> Redis sẽ tăng giá trị tại key page:homepage
thêm 1 mỗi lần người dùng truy cập. Vì dữ liệu lưu ở dạng số nguyên, thao tác rất nhẹ, tốc độ cao và đặc biệt là atomic – đảm bảo tính nhất quán ngay cả khi có nhiều người truy cập cùng lúc.
Mẹo: Kết hợp INCR
với EXPIRE
để tạo bộ đếm trượt theo thời gian (sliding window counters). Ngoài ra, có thể dùng HINCRBY
để nhóm các bộ đếm theo ngày hoặc phân loại khác, ví dụ: HINCRBY stats:daily 2025-07-12 1
=> Tăng bộ đếm truy cập cho ngày 2025-07-12 trong nhóm stats:daily
.
Lưu và gợi ý từ khóa tìm kiếm không trùng lặp
Trong hệ thống tìm kiếm, ta cần lưu danh sách từ khóa người dùng đã tìm, nhưng không muốn lưu trùng. Redis Set là cấu trúc phù hợp vì tự loại bỏ trùng lặp.
Ví dụ để lưu từ khóa tìm kiếm:
SADD search:tags "redis"
SADD search:tags "nodejs"
SMEMBERS search:tags
=> SADD
chỉ thêm nếu phần tử chưa tồn tại. SMEMBERS
lấy toàn bộ tập hợp, là lựa chọn lý tưởng cho autocomplete hoặc filter.
Mẹo: Dùng SINTER
để tìm các tag chung giữa người dùng (intersection), SUNION
để gộp nhiều tập tag lại với nhau. Có thể dùng SPOP
để xoay vòng hoặc chọn ngẫu nhiên một tag trong các kịch bản như gợi ý nội dung luân phiên.
Câu hỏi thường gặp về Redis command
Làm sao kiểm tra key còn tồn tại hay không?
Để kiểm tra một key có tồn tại trong Redis hay không, ta có thể sử dụng lệnh EXISTS <key>
. Lệnh này sẽ trả về 1 nếu key tồn tại và 0 nếu không tồn tại. Ví dụ: EXISTS user:1
sẽ trả về 1
nếu key user:1
đang có trong Redis. Đây là cách kiểm tra đơn giản và rất hữu dụng trước khi thực hiện các thao tác như GET
, DEL
hay EXPIRE
.
Redis command có hỗ trợ atomic không?
Có. Redis đảm bảo rằng tất cả các lệnh đơn lẻ đều được thực thi theo cách atomic – tức là mỗi lệnh được xử lý hoàn toàn trước khi chuyển sang lệnh kế tiếp, không bị gián đoạn hay ghi đè bởi lệnh từ các client khác.
Ngoài ra, Redis cũng hỗ trợ thực hiện giao dịch (transaction) thông qua nhóm lệnh MULTI
, EXEC
, WATCH
và DISCARD
, giúp đảm bảo tính nhất quán khi cần thực hiện nhiều lệnh liên tiếp như một khối thống nhất.
Có command nào để backup hoặc dump dữ liệu Redis không?
Redis không có lệnh xuất dữ liệu thành file như database truyền thống, nhưng cung cấp hai cơ chế sao lưu là RDB (Redis Database Backup) và AOF (Append Only File). Với RDB, ta có thể dùng lệnh SAVE
(đồng bộ) hoặc BGSAVE
(chạy nền) để tạo file dump.rdb
chứa snapshot dữ liệu toàn bộ Redis. Với AOF, Redis sẽ ghi lại mọi lệnh ghi dữ liệu, có thể dùng để khôi phục trạng thái gần nhất.
Ngoài ra, Redis cũng hỗ trợ chế độ hybrid persistence, kết hợp cả RDB và AOF để tăng tính an toàn. Nếu muốn backup, bạn chỉ cần sao chép các file này từ thư mục lưu trữ của Redis.
Tổng kết
Redis không chỉ là một kho lưu tạm đơn thuần, mà là một nền tảng dữ liệu mạnh mẽ có thể xử lý đủ loại bài toán từ cache, hàng đợi, session store cho đến leaderboard hay counting. Việc nắm vững các Redis command giúp ta viết code hiệu quả hơn, tận dụng tối đa tài nguyên hệ thống và xây dựng các ứng dụng có hiệu suất vượt trội.
ITviec hy vọng với cheatsheet và các ví dụ cụ thể trong bài viết, bạn đã có nền tảng vững vàng để bắt đầu ứng dụng Redis vào dự án của mình một cách tự tin và hiệu quả hơn.