Tra cứu 266 lệnh Redis theo nhóm, kèm độ phức tạp, phiên bản bắt đầu có và ví dụ dán thẳng vào redis-cli
Bộ lọc lệnh
Đang hiển thị 266 / 266 lệnh
SET
String
SET key value [NX|XX] [GET] [EX s|PX ms|EXAT ts|PXAT ts|KEEPTTL]
Ghi giá trị chuỗi vào key, ghi đè cả kiểu dữ liệu cũ nếu key đã tồn tại. Các tùy chọn NX, XX, EX, KEEPTTL cho phép gộp cả kiểm tra tồn tại và đặt hạn dùng vào một lệnh nguyên tử.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SET user:1:name phatnguyen EX 3600
GET
String
GET key
Đọc giá trị chuỗi của key. Trả về nil nếu key không tồn tại, báo lỗi WRONGTYPE nếu key đang giữ kiểu khác chuỗi.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
GET user:1:name
GETSET
String
GETSET key value
Đặt giá trị mới và trả về giá trị cũ trong một thao tác nguyên tử. Từ Redis 6.2 lệnh này bị đánh dấu cũ, nên dùng SET với tùy chọn GET.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
GETSET counter:daily 0
GETDEL
String
GETDEL key
Đọc giá trị rồi xóa key ngay trong cùng một thao tác. Rất hợp cho mã dùng một lần, token kích hoạt hay hàng đợi một phần tử.
Độ phức tạp: O(1)Từ Redis 6.2.0
Ví dụ chạy được trong redis-cli
GETDEL otp:0909123456
GETEX
String
GETEX key [EX s|PX ms|EXAT ts|PXAT ts|PERSIST]
Đọc giá trị đồng thời đặt lại hoặc gỡ bỏ hạn dùng của key. Dùng để gia hạn phiên đăng nhập mỗi lần người dùng còn hoạt động.
Độ phức tạp: O(1)Từ Redis 6.2.0
Ví dụ chạy được trong redis-cli
GETEX session:abc123 EX 1800
SETNX
String
SETNX key value
Chỉ ghi khi key chưa tồn tại, trả về 1 nếu ghi được và 0 nếu key đã có. Nền tảng của khóa phân tán đơn giản, nhưng nên dùng SET NX EX để có hạn dùng đi kèm.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SETNX lock:order:1001 worker-7
SETEX
String
SETEX key seconds value
Ghi giá trị kèm hạn dùng tính bằng giây trong một thao tác nguyên tử, tránh cảnh key được ghi mà lệnh EXPIRE theo sau bị lỗi.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
SETEX cache:home 300 rendered-html
PSETEX
String
PSETEX key milliseconds value
Giống SETEX nhưng hạn dùng tính bằng mili giây, dùng cho khóa ngắn hạn và giới hạn tần suất theo cửa sổ nhỏ.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
PSETEX ratelimit:ip:1.2.3.4 500 1
MSET
String
MSET key value [key value ...]
Ghi nhiều cặp key và giá trị trong một lần đi mạng. Toàn bộ thao tác nguyên tử, không bao giờ có trạng thái ghi được một nửa.
Độ phức tạp: O(N) với N là số keyTừ Redis 1.0.1
Ví dụ chạy được trong redis-cli
MSET cfg:host 127.0.0.1 cfg:port 6379 cfg:db 0
MSETNX
String
MSETNX key value [key value ...]
Chỉ ghi khi tất cả key trong danh sách đều chưa tồn tại, chỉ cần một key đã có là toàn bộ lệnh không ghi gì.
Độ phức tạp: O(N) với N là số keyTừ Redis 1.0.1
Ví dụ chạy được trong redis-cli
MSETNX cfg:host 127.0.0.1 cfg:port 6379
MGET
String
MGET key [key ...]
Đọc nhiều key trong một lần đi mạng, key không tồn tại trả về nil ở đúng vị trí. Giảm mạnh số vòng đi mạng so với gọi GET nhiều lần.
Độ phức tạp: O(N) với N là số keyTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
MGET user:1:name user:2:name user:3:name
APPEND
String
APPEND key value
Nối chuỗi vào cuối giá trị hiện có, tạo key mới nếu chưa có, trả về độ dài chuỗi sau khi nối. Hợp cho log gọn nhẹ hoặc gom dữ liệu theo dòng.
Độ phức tạp: O(1) khấu haoTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
APPEND log:job:42 done;
STRLEN
String
STRLEN key
Trả về độ dài tính bằng byte của giá trị chuỗi. Key không tồn tại trả về 0 chứ không báo lỗi.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
STRLEN log:job:42
SETRANGE
String
SETRANGE key offset value
Ghi đè một đoạn chuỗi bắt đầu từ vị trí byte chỉ định, tự chèn byte rỗng nếu offset vượt quá độ dài hiện tại.
Độ phức tạp: O(1) khấu hao khi đoạn ghi nhỏTừ Redis 2.2.0
Ví dụ chạy được trong redis-cli
SETRANGE user:1:flags 2 AB
GETRANGE
String
GETRANGE key start end
Lấy một đoạn con của chuỗi theo chỉ số byte, chấp nhận chỉ số âm để đếm ngược từ cuối.
Độ phức tạp: O(N) với N là độ dài đoạn lấy raTừ Redis 2.4.0
Ví dụ chạy được trong redis-cli
GETRANGE user:1:name 0 3
INCR
String
INCR key
Tăng giá trị số nguyên lên 1 một cách nguyên tử, tự khởi tạo bằng 0 nếu key chưa có. Báo lỗi nếu giá trị hiện tại không phải số nguyên 64 bit.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
INCR pageview:2026-08-16
DECR
String
DECR key
Giảm giá trị số nguyên đi 1 một cách nguyên tử. Dùng cho bộ đếm tồn kho hoặc số lượt còn lại của mã khuyến mãi.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DECR stock:sku-1001
INCRBY
String
INCRBY key increment
Tăng giá trị số nguyên theo mức chỉ định, nhận cả số âm để giảm. Nguyên tử nên nhiều tiến trình cùng gọi vẫn cho tổng đúng.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
INCRBY quota:user:1 100
DECRBY
String
DECRBY key decrement
Giảm giá trị số nguyên theo mức chỉ định. Kết hợp với kiểm tra kết quả trả về để phát hiện khi bộ đếm chạm mức âm.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DECRBY quota:user:1 25
INCRBYFLOAT
String
INCRBYFLOAT key increment
Cộng một số thực vào giá trị chuỗi đang giữ số. Kết quả trả về dạng chuỗi đã cắt bớt số 0 thừa ở cuối phần thập phân.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
INCRBYFLOAT balance:wallet:1 12.5
SUBSTR
String
SUBSTR key start end
Bí danh cũ của GETRANGE, giữ lại để tương thích ngược. Mã mới nên dùng GETRANGE.
Độ phức tạp: O(N) với N là độ dài đoạn lấy raTừ Redis 1.0.0
Tìm chuỗi con chung dài nhất giữa hai key chuỗi, có thể trả về độ dài hoặc vị trí các đoạn khớp. Hữu ích khi so sánh phiên bản văn bản hoặc chuỗi ADN.
Độ phức tạp: O(N*M) với N và M là độ dài hai chuỗiTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
LCS doc:v1 doc:v2 LEN
LPUSH
List
LPUSH key element [element ...]
Chèn một hoặc nhiều phần tử vào đầu danh sách, tự tạo danh sách nếu key chưa tồn tại. Kết hợp với LTRIM để giữ danh sách hoạt động gần nhất có kích thước cố định.
Độ phức tạp: O(1) cho mỗi phần tửTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LPUSH feed:user:1 post-1001 post-1002
RPUSH
List
RPUSH key element [element ...]
Chèn phần tử vào cuối danh sách. Cặp RPUSH và LPOP tạo thành hàng đợi vào trước ra trước cơ bản.
Độ phức tạp: O(1) cho mỗi phần tửTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
RPUSH queue:email job-501 job-502
LPUSHX
List
LPUSHX key element [element ...]
Chỉ chèn vào đầu danh sách khi key đã tồn tại và đang là danh sách, không tự tạo key mới.
Độ phức tạp: O(1) cho mỗi phần tửTừ Redis 2.2.0
Ví dụ chạy được trong redis-cli
LPUSHX feed:user:1 post-1003
RPUSHX
List
RPUSHX key element [element ...]
Chỉ chèn vào cuối danh sách khi key đã tồn tại. Dùng khi bạn không muốn tự sinh hàng đợi rỗng do gõ nhầm tên key.
Độ phức tạp: O(1) cho mỗi phần tửTừ Redis 2.2.0
Ví dụ chạy được trong redis-cli
RPUSHX queue:email job-503
LPOP
List
LPOP key [count]
Lấy và xóa phần tử ở đầu danh sách, có thể lấy nhiều phần tử một lần bằng tham số count từ Redis 6.2.
Độ phức tạp: O(N) với N là số phần tử lấy raTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LPOP queue:email 10
RPOP
List
RPOP key [count]
Lấy và xóa phần tử ở cuối danh sách. Kết hợp LPUSH và RPOP cho ra hàng đợi vào trước ra trước theo chiều ngược lại.
Độ phức tạp: O(N) với N là số phần tử lấy raTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
RPOP queue:email 5
LMPOP
List
LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT n]
Lấy phần tử từ danh sách không rỗng đầu tiên trong nhóm key được liệt kê. Thay thế gọn cho việc thăm dò lần lượt nhiều hàng đợi ưu tiên.
Độ phức tạp: O(N+M) với N là số key và M là số phần tử lấy raTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
LMPOP 2 queue:high queue:low LEFT COUNT 5
BLPOP
List
BLPOP key [key ...] timeout
Bản chờ của LPOP, kết nối bị chặn cho tới khi có phần tử hoặc hết thời gian chờ. Cho phép làm hàng đợi tác vụ không cần vòng lặp thăm dò.
Độ phức tạp: O(N) với N là số key được truyềnTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
BLPOP queue:email 5
BRPOP
List
BRPOP key [key ...] timeout
Bản chờ của RPOP. Timeout bằng 0 nghĩa là chờ vô hạn, cần cân nhắc kỹ với ứng dụng có giới hạn số kết nối.
Độ phức tạp: O(N) với N là số key được truyềnTừ Redis 2.0.0
Bản chờ của LMPOP, gom nhiều hàng đợi ưu tiên vào một lệnh chờ duy nhất thay vì mở nhiều kết nối chờ.
Độ phức tạp: O(N+M) với N là số key và M là số phần tử lấy raTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
BLMPOP 5 2 queue:high queue:low LEFT COUNT 3
LRANGE
List
Nguy hiểm trên production
LRANGE key start stop
Lấy một dải phần tử theo chỉ số, chấp nhận chỉ số âm. LRANGE key 0 -1 trả về toàn bộ danh sách nên rất nguy hiểm với danh sách lớn.
Độ phức tạp: O(S+N) với S là khoảng cách tới phần tử đầu dải và N là số phần tử trả vềTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LRANGE feed:user:1 0 19
Nên dùng thay thế
Không bao giờ chạy LRANGE key 0 -1 trên danh sách lớn. Hãy phân trang theo lô nhỏ như LRANGE key 0 99, LRANGE key 100 199, và giữ danh sách gọn bằng LTRIM sau mỗi lần ghi.
LLEN
List
LLEN key
Trả về số phần tử trong danh sách. Key không tồn tại trả về 0, key thuộc kiểu khác báo lỗi WRONGTYPE.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LLEN queue:email
LINDEX
List
LINDEX key index
Lấy phần tử tại một chỉ số, chỉ số âm đếm ngược từ cuối. Vì danh sách là liên kết nên truy cập phần tử ở giữa phải duyệt tuần tự.
Độ phức tạp: O(N) với N là số phần tử phải duyệt quaTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LINDEX feed:user:1 0
LSET
List
LSET key index element
Ghi đè phần tử tại chỉ số cho trước, báo lỗi nếu chỉ số nằm ngoài phạm vi danh sách.
Độ phức tạp: O(N) với N là số phần tử phải duyệt quaTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LSET feed:user:1 0 post-9999
LINSERT
List
LINSERT key BEFORE|AFTER pivot element
Chèn phần tử ngay trước hoặc ngay sau lần xuất hiện đầu tiên của giá trị mốc. Trả về -1 khi không tìm thấy mốc.
Độ phức tạp: O(N) với N là số phần tử phải duyệt tới mốcTừ Redis 2.2.0
Ví dụ chạy được trong redis-cli
LINSERT feed:user:1 BEFORE post-1001 post-1000
LREM
List
LREM key count element
Xóa các phần tử bằng giá trị cho trước, count dương xóa từ đầu, count âm xóa từ cuối, count bằng 0 xóa hết.
Độ phức tạp: O(N+M) với N là độ dài danh sách và M là số phần tử bị xóaTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LREM queue:email 1 job-501
LTRIM
List
LTRIM key start stop
Cắt danh sách chỉ giữ lại dải chỉ định, phần ngoài dải bị xóa vĩnh viễn. Là cách chuẩn giữ danh sách hoạt động gần đây ở kích thước cố định.
Độ phức tạp: O(N) với N là số phần tử bị loại bỏTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LTRIM feed:user:1 0 99
LMOVE
List
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
Chuyển nguyên tử một phần tử từ danh sách này sang danh sách khác, chọn được đầu hay cuối cho cả hai phía. Nền tảng của mẫu hàng đợi tin cậy.
Độ phức tạp: O(1)Từ Redis 6.2.0
Ví dụ chạy được trong redis-cli
LMOVE queue:pending queue:processing LEFT RIGHT
RPOPLPUSH
List
RPOPLPUSH source destination
Lấy phần tử cuối danh sách nguồn và đẩy vào đầu danh sách đích trong một thao tác nguyên tử. Từ Redis 6.2 nên chuyển sang LMOVE.
Bản chờ của LMOVE, chặn tới khi danh sách nguồn có phần tử. Cách chuẩn để tiến trình xử lý lấy việc mà không mất việc nếu tiến trình chết giữa chừng.
Độ phức tạp: O(1)Từ Redis 6.2.0
Ví dụ chạy được trong redis-cli
BLMOVE queue:pending queue:processing LEFT RIGHT 5
BRPOPLPUSH
List
BRPOPLPUSH source destination timeout
Bản chờ của RPOPLPUSH, đã bị đánh dấu cũ từ Redis 6.2 và nên thay bằng BLMOVE.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
BRPOPLPUSH queue:pending queue:processing 5
LPOS
List
LPOS key element [RANK r] [COUNT n] [MAXLEN len]
Tìm chỉ số của phần tử trong danh sách, hỗ trợ tìm nhiều lần xuất hiện và giới hạn số phần tử quét bằng MAXLEN.
Độ phức tạp: O(N) với N là số phần tử phải quétTừ Redis 6.0.6
Ví dụ chạy được trong redis-cli
LPOS queue:email job-502 COUNT 1
SADD
Set
SADD key member [member ...]
Thêm một hoặc nhiều thành viên vào tập hợp, tự bỏ qua thành viên đã có. Trả về số thành viên thật sự được thêm mới.
Độ phức tạp: O(1) cho mỗi thành viênTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SADD tags:post:1 redis cache database
SREM
Set
SREM key member [member ...]
Xóa thành viên khỏi tập hợp, bỏ qua thành viên không tồn tại. Tập hợp rỗng sẽ tự bị xóa khỏi keyspace.
Độ phức tạp: O(N) với N là số thành viên truyền vàoTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SREM tags:post:1 cache
SPOP
Set
SPOP key [count]
Lấy và xóa ngẫu nhiên một hoặc nhiều thành viên. Dùng cho bốc thăm, chia mẫu ngẫu nhiên hoặc hàng đợi không cần thứ tự.
Độ phức tạp: O(N) với N là số thành viên lấy raTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SPOP lottery:pool 3
SRANDMEMBER
Set
SRANDMEMBER key [count]
Lấy ngẫu nhiên thành viên mà không xóa. Count âm cho phép trả về phần tử lặp lại, count dương đảm bảo các phần tử khác nhau.
Độ phức tạp: O(N) với N là số thành viên trả vềTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SRANDMEMBER tags:post:1 2
SMOVE
Set
SMOVE source destination member
Chuyển nguyên tử một thành viên từ tập hợp này sang tập hợp khác. Nếu thành viên không có trong nguồn thì không làm gì cả.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SMOVE users:trial users:paid user-1001
SCARD
Set
SCARD key
Đếm số thành viên của tập hợp. Redis lưu sẵn số lượng nên lệnh này luôn nhanh dù tập hợp lớn tới đâu.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SCARD tags:post:1
SISMEMBER
Set
SISMEMBER key member
Kiểm tra một giá trị có thuộc tập hợp không, trả về 1 hoặc 0. Đây là cách kiểm tra thành viên rẻ nhất, hãy dùng thay cho việc kéo cả tập hợp về ứng dụng.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SISMEMBER tags:post:1 redis
SMISMEMBER
Set
SMISMEMBER key member [member ...]
Kiểm tra nhiều thành viên cùng lúc, trả về mảng 1 và 0 theo đúng thứ tự truyền vào. Tiết kiệm nhiều vòng đi mạng so với gọi SISMEMBER lặp lại.
Độ phức tạp: O(N) với N là số thành viên kiểm traTừ Redis 6.2.0
Ví dụ chạy được trong redis-cli
SMISMEMBER tags:post:1 redis mysql cache
SMEMBERS
Set
Nguy hiểm trên production
SMEMBERS key
Trả về toàn bộ thành viên của tập hợp trong một lần. Với tập hợp hàng triệu phần tử, lệnh này chặn tiến trình chính và tạo gói trả về khổng lồ.
Độ phức tạp: O(N) với N là kích thước tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SMEMBERS tags:post:1
Nên dùng thay thế
Dùng SSCAN key 0 COUNT 100 để duyệt theo lô, hoặc SISMEMBER và SMISMEMBER nếu bạn chỉ cần kiểm tra thành viên. Chỉ dùng SMEMBERS khi chắc chắn tập hợp dưới vài trăm phần tử.
SINTER
Set
SINTER key [key ...]
Trả về giao của các tập hợp. Redis tối ưu bằng cách bắt đầu từ tập hợp nhỏ nhất, nhưng kết quả vẫn có thể rất lớn.
Độ phức tạp: O(N*M) với N là kích thước tập nhỏ nhất và M là số tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SINTER tags:redis tags:cache
SINTERCARD
Set
SINTERCARD numkeys key [key ...] [LIMIT n]
Đếm số phần tử trong giao mà không trả về danh sách phần tử, kèm tùy chọn LIMIT để dừng sớm. Rất hợp khi chỉ cần biết có bao nhiêu điểm chung.
Độ phức tạp: O(N*M) với N là kích thước tập nhỏ nhất và M là số tập hợpTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
SINTERCARD 2 tags:redis tags:cache LIMIT 100
SINTERSTORE
Set
SINTERSTORE destination key [key ...]
Tính giao và lưu thẳng vào key đích thay vì gửi về client. Giữ dữ liệu lớn ở lại phía máy chủ, tiết kiệm băng thông.
Độ phức tạp: O(N*M) với N là kích thước tập nhỏ nhất và M là số tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SINTERSTORE result:common tags:redis tags:cache
SUNION
Set
SUNION key [key ...]
Trả về hợp của các tập hợp, mỗi phần tử chỉ xuất hiện một lần. Kích thước kết quả bằng tổng các tập nên cần thận trọng.
Độ phức tạp: O(N) với N là tổng số phần tử của mọi tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SUNION tags:redis tags:cache
SUNIONSTORE
Set
SUNIONSTORE destination key [key ...]
Tính hợp rồi lưu vào key đích, ghi đè key đích nếu đã tồn tại.
Độ phức tạp: O(N) với N là tổng số phần tử của mọi tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SUNIONSTORE result:all tags:redis tags:cache
SDIFF
Set
SDIFF key [key ...]
Trả về hiệu của tập hợp thứ nhất trừ đi các tập hợp còn lại. Hay dùng để tìm nhóm người dùng chưa thực hiện một hành động.
Độ phức tạp: O(N) với N là tổng số phần tử của mọi tập hợpTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SDIFF users:all users:purchased
SDIFFSTORE
Set
SDIFFSTORE destination key [key ...]
Tính hiệu rồi lưu vào key đích. Đặt hạn dùng cho key đích ngay sau đó để nó không nằm lại mãi trong bộ nhớ.
Độ phức tạp: O(N) với N là tổng số phần tử của mọi tập hợpTừ Redis 1.0.0
Duyệt tập hợp theo con trỏ, mỗi lần trả về một lô nhỏ. Đây là cách an toàn thay thế SMEMBERS trên tập hợp lớn.
Độ phức tạp: O(1) cho mỗi lần gọi, O(N) cho trọn vòng duyệtTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
SSCAN tags:post:1 0 COUNT 100
ZADD
Sorted Set
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
Thêm thành viên kèm điểm số vào tập hợp có thứ tự, cập nhật điểm nếu thành viên đã tồn tại. GT và LT chỉ cho phép điểm tăng hoặc giảm, rất hợp cho bảng xếp hạng.
Độ phức tạp: O(log(N)) cho mỗi thành viênTừ Redis 1.2.0
Ví dụ chạy được trong redis-cli
ZADD leaderboard 1500 player-1 1200 player-2
ZINCRBY
Sorted Set
ZINCRBY key increment member
Cộng thêm điểm cho một thành viên, tự tạo thành viên với điểm bằng mức cộng nếu chưa tồn tại. Nguyên tử nên an toàn khi nhiều tiến trình cùng ghi điểm.
Độ phức tạp: O(log(N))Từ Redis 1.2.0
Ví dụ chạy được trong redis-cli
ZINCRBY leaderboard 50 player-1
ZREM
Sorted Set
ZREM key member [member ...]
Xóa một hoặc nhiều thành viên khỏi tập hợp có thứ tự. Trả về số thành viên thật sự bị xóa.
Độ phức tạp: O(M*log(N)) với M là số thành viên bị xóaTừ Redis 1.2.0
Ví dụ chạy được trong redis-cli
ZREM leaderboard player-2
ZSCORE
Sorted Set
ZSCORE key member
Đọc điểm số của một thành viên, trả về nil nếu thành viên không tồn tại.
Độ phức tạp: O(1)Từ Redis 1.2.0
Ví dụ chạy được trong redis-cli
ZSCORE leaderboard player-1
ZMSCORE
Sorted Set
ZMSCORE key member [member ...]
Đọc điểm của nhiều thành viên trong một lệnh, trả về mảng theo đúng thứ tự truyền vào.
Độ phức tạp: O(N) với N là số thành viên truy vấnTừ Redis 6.2.0
Ví dụ chạy được trong redis-cli
ZMSCORE leaderboard player-1 player-2 player-3
ZCARD
Sorted Set
ZCARD key
Đếm tổng số thành viên trong tập hợp có thứ tự, luôn nhanh vì Redis lưu sẵn con số này.
Độ phức tạp: O(1)Từ Redis 1.2.0
Ví dụ chạy được trong redis-cli
ZCARD leaderboard
ZCOUNT
Sorted Set
ZCOUNT key min max
Đếm số thành viên có điểm nằm trong khoảng cho trước. Dùng dấu ngoặc đơn để loại trừ biên và inf cho vô cực.
Độ phức tạp: O(log(N))Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
ZCOUNT leaderboard 1000 2000
ZLEXCOUNT
Sorted Set
ZLEXCOUNT key min max
Đếm thành viên trong khoảng theo thứ tự từ điển, chỉ đúng khi mọi thành viên có cùng điểm số.
Duyệt tập hợp có thứ tự theo con trỏ, trả về từng lô cặp thành viên và điểm. Cách an toàn để xuất toàn bộ bảng xếp hạng lớn.
Độ phức tạp: O(1) cho mỗi lần gọi, O(N) cho trọn vòng duyệtTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
ZSCAN leaderboard 0 COUNT 100
HSET
Hash
HSET key field value [field value ...]
Ghi một hoặc nhiều trường vào hash, tạo hash nếu key chưa tồn tại. Từ Redis 4.0 lệnh này nhận nhiều cặp và thay thế HMSET.
Độ phức tạp: O(1) cho mỗi trườngTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HSET user:1 name phatnguyen email a@b.com age 30
HSETNX
Hash
HSETNX key field value
Chỉ ghi trường khi trường đó chưa tồn tại trong hash, trả về 1 nếu ghi được. Dùng để khởi tạo giá trị mặc định mà không đè dữ liệu có sẵn.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HSETNX user:1 role member
HGET
Hash
HGET key field
Đọc giá trị của một trường trong hash, trả về nil nếu trường hoặc key không tồn tại.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HGET user:1 name
HMSET
Hash
HMSET key field value [field value ...]
Ghi nhiều trường cùng lúc. Đã bị đánh dấu cũ từ Redis 4.0, mã mới nên dùng HSET vì HSET đã nhận nhiều cặp.
Độ phức tạp: O(N) với N là số trườngTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HMSET user:2 name lan email lan@b.com
HMGET
Hash
HMGET key field [field ...]
Đọc nhiều trường trong một lệnh, trả về mảng theo đúng thứ tự truyền vào với nil cho trường không tồn tại. Đây là cách nên dùng thay cho HGETALL khi bạn biết mình cần trường nào.
Độ phức tạp: O(N) với N là số trườngTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HMGET user:1 name email age
HGETALL
Hash
Nguy hiểm trên production
HGETALL key
Trả về toàn bộ trường và giá trị của hash. Trên hash có hàng chục nghìn trường, lệnh này chặn tiến trình chính và tạo gói trả về rất lớn.
Độ phức tạp: O(N) với N là số trường trong hashTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HGETALL user:1
Nên dùng thay thế
Dùng HMGET khi biết trước danh sách trường cần đọc, hoặc HSCAN key 0 COUNT 100 để duyệt theo lô. Chỉ dùng HGETALL cho hash nhỏ dưới vài trăm trường.
HDEL
Hash
HDEL key field [field ...]
Xóa một hoặc nhiều trường khỏi hash. Hash rỗng sẽ tự bị xóa khỏi keyspace.
Độ phức tạp: O(N) với N là số trường truyền vàoTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HDEL user:1 age
HLEN
Hash
HLEN key
Đếm số trường trong hash. Luôn nhanh vì Redis lưu sẵn con số này.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HLEN user:1
HEXISTS
Hash
HEXISTS key field
Kiểm tra một trường có tồn tại trong hash không, trả về 1 hoặc 0.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HEXISTS user:1 email
HKEYS
Hash
Nguy hiểm trên production
HKEYS key
Trả về danh sách tên tất cả các trường trong hash. Vẫn phải duyệt toàn bộ hash nên nguy hiểm y như HGETALL trên hash lớn.
Độ phức tạp: O(N) với N là số trường trong hashTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HKEYS user:1
Nên dùng thay thế
Dùng HSCAN key 0 COUNT 100 với NOVALUES từ Redis 7.4 để duyệt tên trường theo lô, hoặc lưu sẵn danh sách trường ở một key riêng nếu bạn cần đọc nó thường xuyên.
HVALS
Hash
Nguy hiểm trên production
HVALS key
Trả về danh sách giá trị của tất cả các trường. Cùng chi phí và cùng rủi ro như HGETALL.
Độ phức tạp: O(N) với N là số trường trong hashTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HVALS user:1
Nên dùng thay thế
Dùng HSCAN key 0 COUNT 100 để duyệt theo lô, hoặc HMGET nếu bạn chỉ cần một tập trường xác định.
HINCRBY
Hash
HINCRBY key field increment
Cộng một số nguyên vào giá trị của trường, nhận cả số âm. Cách gọn để gom nhiều bộ đếm liên quan vào một key duy nhất.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
HINCRBY stats:2026-08 pageview 1
HINCRBYFLOAT
Hash
HINCRBYFLOAT key field increment
Cộng một số thực vào giá trị của trường, trả về giá trị mới dạng chuỗi.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
HINCRBYFLOAT cart:1 total 199.99
HRANDFIELD
Hash
HRANDFIELD key [count [WITHVALUES]]
Lấy ngẫu nhiên tên trường từ hash, count âm cho phép trùng lặp. Dùng để lấy mẫu mà không phải kéo cả hash về.
Độ phức tạp: O(N) với N là số trường trả vềTừ Redis 6.2.0
Ví dụ chạy được trong redis-cli
HRANDFIELD user:1 2 WITHVALUES
HSTRLEN
Hash
HSTRLEN key field
Trả về độ dài chuỗi của giá trị trong một trường mà không phải đọc cả giá trị về.
Duyệt hash theo con trỏ, trả về từng lô cặp trường và giá trị. Tùy chọn NOVALUES từ Redis 7.4 chỉ trả về tên trường, tiết kiệm băng thông.
Độ phức tạp: O(1) cho mỗi lần gọi, O(N) cho trọn vòng duyệtTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
HSCAN user:1 0 COUNT 100
HEXPIRE
Hash
HEXPIRE key seconds [NX|XX|GT|LT] FIELDS numfields field [field ...]
Đặt hạn dùng cho từng trường riêng lẻ bên trong hash, không phải cho cả key. Tính năng mới từ Redis 7.4 giúp gom nhiều mục có hạn dùng khác nhau vào một hash.
Độ phức tạp: O(N) với N là số trường được đặt hạnTừ Redis 7.4.0
Ví dụ chạy được trong redis-cli
HEXPIRE session:1 600 FIELDS 1 token
HTTL
Hash
HTTL key FIELDS numfields field [field ...]
Đọc thời gian còn lại của từng trường trong hash, trả về -1 khi trường không có hạn dùng và -2 khi trường không tồn tại.
Độ phức tạp: O(N) với N là số trường truy vấnTừ Redis 7.4.0
Ví dụ chạy được trong redis-cli
HTTL session:1 FIELDS 1 token
HPERSIST
Hash
HPERSIST key FIELDS numfields field [field ...]
Gỡ bỏ hạn dùng của các trường trong hash, biến chúng thành trường tồn tại vĩnh viễn.
Độ phức tạp: O(N) với N là số trường truyền vàoTừ Redis 7.4.0
Ví dụ chạy được trong redis-cli
HPERSIST session:1 FIELDS 1 token
DEL
Key
Nguy hiểm trên production
DEL key [key ...]
Xóa một hoặc nhiều key, giải phóng bộ nhớ ngay trong tiến trình chính. Xóa một key chứa hàng triệu phần tử sẽ chặn máy chủ trong nhiều mili giây tới cả giây.
Độ phức tạp: O(N) với N là số phần tử bên trong các key bị xóaTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DEL cache:home cache:about
Nên dùng thay thế
Với key lớn như tập hợp hoặc hash hàng triệu phần tử, hãy dùng UNLINK để việc thu hồi bộ nhớ chạy ở luồng nền. DEL chỉ an toàn với key nhỏ.
UNLINK
Key
UNLINK key [key ...]
Gỡ key khỏi keyspace ngay lập tức rồi để luồng nền thu hồi bộ nhớ. Đây là lệnh xóa mặc định nên dùng trên môi trường thật.
Độ phức tạp: O(1) cho mỗi key, phần thu hồi bộ nhớ chạy ở luồng nềnTừ Redis 4.0.0
Ví dụ chạy được trong redis-cli
UNLINK bigset:archive
EXISTS
Key
EXISTS key [key ...]
Kiểm tra key tồn tại, khi truyền nhiều key thì trả về tổng số key tồn tại, kể cả khi cùng một key được lặp lại.
Độ phức tạp: O(N) với N là số key truyền vàoTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
EXISTS user:1 user:2 user:3
EXPIRE
Key
EXPIRE key seconds [NX|XX|GT|LT]
Đặt hạn dùng tính bằng giây cho key. Các tùy chọn NX, XX, GT, LT từ Redis 7.0 cho phép chỉ đặt khi thỏa điều kiện, tránh vô tình rút ngắn hạn dùng.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
EXPIRE cache:home 300
EXPIREAT
Key
EXPIREAT key unix-time-seconds [NX|XX|GT|LT]
Đặt thời điểm hết hạn tuyệt đối theo dấu thời gian Unix tính bằng giây. Hợp khi nhiều key phải cùng hết hạn tại một mốc cố định.
Độ phức tạp: O(1)Từ Redis 1.2.0
Ví dụ chạy được trong redis-cli
EXPIREAT cache:daily 1755302400
PEXPIRE
Key
PEXPIRE key milliseconds [NX|XX|GT|LT]
Đặt hạn dùng tính bằng mili giây, dùng cho khóa phân tán và cửa sổ giới hạn tần suất dưới một giây.
Đặt thời điểm hết hạn tuyệt đối theo dấu thời gian Unix tính bằng mili giây.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
PEXPIREAT cache:daily 1755302400000
EXPIRETIME
Key
EXPIRETIME key
Trả về thời điểm hết hạn tuyệt đối của key tính bằng giây Unix, thay vì số giây còn lại như TTL. Rất tiện khi cần so sánh mốc hết hạn giữa nhiều key.
Độ phức tạp: O(1)Từ Redis 7.0.0
Ví dụ chạy được trong redis-cli
EXPIRETIME cache:home
PEXPIRETIME
Key
PEXPIRETIME key
Trả về thời điểm hết hạn tuyệt đối tính bằng mili giây Unix.
Độ phức tạp: O(1)Từ Redis 7.0.0
Ví dụ chạy được trong redis-cli
PEXPIRETIME cache:home
TTL
Key
TTL key
Trả về số giây còn lại trước khi key hết hạn. Giá trị -1 nghĩa là key tồn tại nhưng không có hạn dùng, -2 nghĩa là key không tồn tại.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
TTL cache:home
PTTL
Key
PTTL key
Giống TTL nhưng trả về số mili giây còn lại, cần thiết khi làm việc với khóa ngắn hạn.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
PTTL lock:order:1001
PERSIST
Key
PERSIST key
Gỡ bỏ hạn dùng của key, biến nó thành key tồn tại vĩnh viễn. Trả về 1 nếu key có hạn dùng và đã được gỡ.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
PERSIST cache:home
RENAME
Key
RENAME key newkey
Đổi tên key, ghi đè key đích nếu key đích đã tồn tại. Việc ghi đè này ngầm xóa key đích nên có thể chặn nếu key đích rất lớn.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
RENAME cache:home cache:home:old
RENAMENX
Key
RENAMENX key newkey
Đổi tên key nhưng chỉ khi key đích chưa tồn tại, trả về 0 nếu key đích đã có.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
RENAMENX cache:home cache:home:v2
TYPE
Key
TYPE key
Trả về kiểu dữ liệu của key: string, list, set, zset, hash hoặc stream. Cách nhanh nhất để gỡ lỗi WRONGTYPE.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
TYPE user:1
KEYS
Key
Nguy hiểm trên production
KEYS pattern
Trả về mọi key khớp mẫu bằng cách duyệt toàn bộ keyspace. Vì Redis xử lý lệnh trên một luồng, lệnh này khóa toàn bộ máy chủ trong suốt thời gian quét.
Độ phức tạp: O(N) với N là tổng số key trong cơ sở dữ liệuTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
KEYS user:*
Nên dùng thay thế
Luôn dùng SCAN 0 MATCH user:* COUNT 100 và lặp theo con trỏ. SCAN chỉ chiếm máy chủ trong từng lát rất ngắn, không khóa server. Nếu cần lọc theo kiểu, thêm TYPE hash vào SCAN.
SCAN
Key
SCAN cursor [MATCH pattern] [COUNT n] [TYPE type]
Duyệt keyspace theo con trỏ, mỗi lần trả về một lô nhỏ cùng con trỏ kế tiếp. Vòng duyệt kết thúc khi con trỏ trả về bằng 0.
Độ phức tạp: O(1) cho mỗi lần gọi, O(N) cho trọn vòng duyệtTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
SCAN 0 MATCH user:* COUNT 100 TYPE hash
RANDOMKEY
Key
Nguy hiểm trên production
RANDOMKEY
Trả về một key ngẫu nhiên trong cơ sở dữ liệu hiện tại. Bản thân một lần gọi rất rẻ, nhưng gọi trong vòng lặp để lấy mẫu là kiểu dùng sai phổ biến.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
RANDOMKEY
Nên dùng thay thế
Đừng gọi RANDOMKEY trong vòng lặp để lấy mẫu keyspace, khi phần lớn key đã hết hạn thì mỗi lần gọi phải thử lại nhiều lần và chi phí tăng vọt. Hãy dùng SCAN với COUNT vừa phải, hoặc redis-cli --memkeys nếu chỉ cần lấy mẫu để phân tích.
DUMP
Key
DUMP key
Xuất giá trị của key ra chuỗi nhị phân đã tuần tự hóa, kèm phiên bản và mã kiểm tra. Ghép với RESTORE để chuyển key giữa các máy chủ.
Độ phức tạp: O(1) cộng O(N*M) để tuần tự hóa giá trịTừ Redis 2.6.0
Chuyển key sang một cơ sở dữ liệu khác trong cùng phiên bản, không làm gì nếu key đích đã tồn tại. Không dùng được trong chế độ cluster.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
MOVE user:1 1
COPY
Key
COPY source destination [DB n] [REPLACE]
Nhân bản giá trị của một key sang key mới, có thể sang cơ sở dữ liệu khác. Thay thế gọn cho cặp DUMP và RESTORE khi cùng một máy chủ.
Độ phức tạp: O(N) với N là số phần tử bên trong key nguồnTừ Redis 6.2.0
Ví dụ chạy được trong redis-cli
COPY user:1 user:1:backup REPLACE
TOUCH
Key
TOUCH key [key ...]
Chạm vào key để cập nhật thời gian truy cập cuối, trả về số key tồn tại. Hữu ích khi dùng chính sách loại bỏ theo tần suất hoặc thời gian nhàn rỗi.
Độ phức tạp: O(N) với N là số key truyền vàoTừ Redis 3.2.1
Ví dụ chạy được trong redis-cli
TOUCH user:1 user:2
OBJECT ENCODING
Key
OBJECT ENCODING key
Cho biết Redis đang lưu key bằng cách mã hóa nào, ví dụ listpack, hashtable, intset, skiplist, embstr hay raw. Đây là công cụ chính để kiểm chứng key có đang ở dạng nén bộ nhớ hay không.
Độ phức tạp: O(1)Từ Redis 2.2.3
Ví dụ chạy được trong redis-cli
OBJECT ENCODING user:1
OBJECT FREQ
Key
OBJECT FREQ key
Trả về bộ đếm tần suất truy cập của key, chỉ dùng được khi maxmemory-policy đang là allkeys-lfu hoặc volatile-lfu.
Độ phức tạp: O(1)Từ Redis 4.0.0
Ví dụ chạy được trong redis-cli
OBJECT FREQ user:1
OBJECT IDLETIME
Key
OBJECT IDLETIME key
Trả về số giây key không được truy cập, chỉ dùng được khi chính sách loại bỏ không phải dạng LFU. Dùng để tìm dữ liệu nguội cần dọn.
Độ phức tạp: O(1)Từ Redis 2.2.3
Ví dụ chạy được trong redis-cli
OBJECT IDLETIME user:1
OBJECT REFCOUNT
Key
OBJECT REFCOUNT key
Trả về số tham chiếu tới đối tượng. Với số nguyên nhỏ được chia sẻ, con số này rất lớn vì Redis dùng chung một đối tượng cho nhiều key.
Sắp xếp phần tử của danh sách, tập hợp hoặc tập hợp có thứ tự, có thể lấy kèm dữ liệu từ key khác qua tùy chọn GET. Rất mạnh nhưng cũng rất tốn kém.
Độ phức tạp: O(N+M*log(M)) với N là số phần tử và M là số phần tử trả vềTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SORT queue:email LIMIT 0 10 ALPHA
Nên dùng thay thế
Trên tập lớn, SORT phải dựng bản sao và sắp xếp toàn bộ trong bộ nhớ, khóa server suốt thời gian đó. Hãy lưu sẵn dữ liệu vào Sorted Set rồi dùng ZRANGE, hoặc sắp xếp ở phía ứng dụng. Nếu chỉ đọc, dùng SORT_RO để lệnh chạy được trên bản sao.
Bản chỉ đọc của SORT, không có tùy chọn STORE nên chạy được trên nút bản sao. Chi phí vẫn y hệt SORT.
Độ phức tạp: O(N+M*log(M)) với N là số phần tử và M là số phần tử trả vềTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
SORT_RO queue:email LIMIT 0 10 ALPHA
XADD
Stream
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT n]] *|id field value [field value ...]
Ghi một mục mới vào stream, dấu sao để Redis tự sinh mã theo dấu thời gian. Tùy chọn MAXLEN với dấu ngã cắt bớt gần đúng và rẻ hơn nhiều so với cắt chính xác.
Độ phức tạp: O(1) khi thêm mục mới, O(N) khi có cắt bớtTừ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XADD orders MAXLEN ~ 10000 * sku SKU-1001 qty 2
XLEN
Stream
XLEN key
Đếm số mục hiện có trong stream. Con số này giảm khi bạn cắt bớt bằng XTRIM hoặc xóa bằng XDEL.
Độ phức tạp: O(1)Từ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XLEN orders
XRANGE
Stream
XRANGE key start end [COUNT n]
Đọc các mục trong khoảng mã, dùng dấu trừ và dấu cộng cho mã nhỏ nhất và lớn nhất. Luôn kèm COUNT để tránh kéo cả stream về.
Độ phức tạp: O(N) với N là số mục trả vềTừ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XRANGE orders - + COUNT 10
XREVRANGE
Stream
XREVRANGE key end start [COUNT n]
Giống XRANGE nhưng trả về theo thứ tự ngược, tiện để lấy các mục mới nhất. Lưu ý thứ tự tham số là end trước start.
Độ phức tạp: O(N) với N là số mục trả vềTừ Redis 5.0.0
Xác nhận đã xử lý xong mục, gỡ nó khỏi danh sách chờ của nhóm. Quên gọi XACK là nguyên nhân số một khiến danh sách chờ phình to.
Độ phức tạp: O(1) cho mỗi mãTừ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XACK orders workers 1755300000000-0
XPENDING
Stream
XPENDING key group [[IDLE ms] start end count [consumer]]
Xem các mục đã giao nhưng chưa được xác nhận, có thể lọc theo thời gian nhàn rỗi và theo consumer. Đây là lệnh chẩn đoán chính khi tiến trình xử lý bị treo.
Độ phức tạp: O(N) với N là số mục trả vềTừ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XPENDING orders workers IDLE 60000 - + 10
XCLAIM
Stream
XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [RETRYCOUNT n] [FORCE] [JUSTID]
Chuyển quyền sở hữu mục đang chờ sang consumer khác khi consumer cũ đã nhàn rỗi quá lâu. Cơ chế phục hồi khi một tiến trình xử lý chết giữa chừng.
Độ phức tạp: O(log N) với N là số mục trong danh sách chờTừ Redis 5.0.0
Đặt lại mã mục cuối cùng của stream. Chủ yếu dùng khi sao chép stream sang máy chủ khác và cần giữ nguyên dòng mã.
Độ phức tạp: O(1)Từ Redis 5.0.0
Ví dụ chạy được trong redis-cli
XSETID orders 1755300000000-0
SUBSCRIBE
Pub/Sub
SUBSCRIBE channel [channel ...]
Đăng ký nhận tin trên một hoặc nhiều kênh. Kết nối chuyển sang chế độ đăng ký và chỉ chấp nhận một nhóm lệnh giới hạn cho tới khi hủy đăng ký.
Độ phức tạp: O(N) với N là số kênh đăng kýTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
SUBSCRIBE news:vn news:global
UNSUBSCRIBE
Pub/Sub
UNSUBSCRIBE [channel [channel ...]]
Hủy đăng ký khỏi kênh cụ thể, hoặc khỏi tất cả kênh nếu không truyền tham số.
Độ phức tạp: O(N) với N là số kênh hủy đăng kýTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
UNSUBSCRIBE news:vn
PSUBSCRIBE
Pub/Sub
PSUBSCRIBE pattern [pattern ...]
Đăng ký theo mẫu tên kênh. Mọi tin đăng lên kênh khớp mẫu đều được chuyển tiếp, nhưng việc so khớp mẫu tốn chi phí cho mỗi tin đăng.
Độ phức tạp: O(N) với N là số mẫu đăng kýTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
PSUBSCRIBE news:*
PUNSUBSCRIBE
Pub/Sub
PUNSUBSCRIBE [pattern [pattern ...]]
Hủy đăng ký theo mẫu, hoặc hủy toàn bộ mẫu nếu không truyền tham số.
Độ phức tạp: O(N+M) với N là số mẫu và M là tổng số mẫu đang đăng kýTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
PUNSUBSCRIBE news:*
PUBLISH
Pub/Sub
PUBLISH channel message
Đăng một tin lên kênh, trả về số người nhận. Tin không được lưu lại, ai không đang lắng nghe thì mất tin vĩnh viễn.
Độ phức tạp: O(N+M) với N là số người đăng ký kênh và M là số mẫu đang đăng kýTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
PUBLISH news:vn hello-world
SPUBLISH
Pub/Sub
SPUBLISH shardchannel message
Đăng tin lên kênh phân mảnh trong chế độ cluster. Tin chỉ đi tới các nút chịu trách nhiệm cho khe của kênh, không phát tán khắp cluster.
Độ phức tạp: O(N) với N là số người đăng ký kênh phân mảnhTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
SPUBLISH orders:shard1 new-order
SSUBSCRIBE
Pub/Sub
SSUBSCRIBE shardchannel [shardchannel ...]
Đăng ký kênh phân mảnh. Đây là cách dùng pub/sub trong cluster mà không tạo lưu lượng lan truyền giữa mọi nút.
Độ phức tạp: O(N) với N là số kênh đăng kýTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
SSUBSCRIBE orders:shard1
SUNSUBSCRIBE
Pub/Sub
SUNSUBSCRIBE [shardchannel [shardchannel ...]]
Hủy đăng ký kênh phân mảnh, hoặc hủy tất cả nếu không truyền tham số.
Độ phức tạp: O(N) với N là số kênh hủy đăng kýTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
SUNSUBSCRIBE orders:shard1
PUBSUB CHANNELS
Pub/Sub
PUBSUB CHANNELS [pattern]
Liệt kê các kênh đang có ít nhất một người đăng ký. Không hiện các kênh chỉ được đăng ký qua mẫu.
Độ phức tạp: O(N) với N là số kênh đang hoạt độngTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
PUBSUB CHANNELS news:*
PUBSUB NUMSUB
Pub/Sub
PUBSUB NUMSUB [channel [channel ...]]
Đếm số người đăng ký của từng kênh được liệt kê, không tính người đăng ký theo mẫu.
Độ phức tạp: O(N) với N là số kênh truyền vàoTừ Redis 2.8.0
Ví dụ chạy được trong redis-cli
PUBSUB NUMSUB news:vn news:global
PUBSUB NUMPAT
Pub/Sub
PUBSUB NUMPAT
Đếm tổng số mẫu đăng ký duy nhất trên toàn máy chủ. Con số này ảnh hưởng trực tiếp tới chi phí của mỗi lệnh PUBLISH.
Độ phức tạp: O(1)Từ Redis 2.8.0
Ví dụ chạy được trong redis-cli
PUBSUB NUMPAT
PUBSUB SHARDCHANNELS
Pub/Sub
PUBSUB SHARDCHANNELS [pattern]
Liệt kê các kênh phân mảnh đang hoạt động trên nút hiện tại trong chế độ cluster.
Độ phức tạp: O(N) với N là số kênh phân mảnh đang hoạt độngTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
PUBSUB SHARDCHANNELS orders:*
MULTI
Transaction
MULTI
Mở một khối lệnh, các lệnh sau đó chỉ được xếp hàng chứ chưa chạy. Lỗi cú pháp lúc xếp hàng sẽ làm cả khối bị hủy khi gọi EXEC.
Độ phức tạp: O(1)Từ Redis 1.2.0
Ví dụ chạy được trong redis-cli
MULTI
EXEC
Transaction
EXEC
Chạy toàn bộ lệnh đã xếp hàng theo đúng thứ tự, không lệnh nào khác chen vào giữa. Trả về nil nếu có key bị WATCH đã thay đổi.
Độ phức tạp: O(N) với N là tổng chi phí các lệnh trong khốiTừ Redis 1.2.0
Ví dụ chạy được trong redis-cli
EXEC
DISCARD
Transaction
DISCARD
Hủy khối lệnh đang xếp hàng và gỡ mọi key đang bị WATCH, đưa kết nối về trạng thái bình thường.
Độ phức tạp: O(N) với N là số lệnh đã xếp hàngTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
DISCARD
WATCH
Transaction
WATCH key [key ...]
Theo dõi key để khóa lạc quan, nếu key bị thay đổi trước khi EXEC chạy thì cả khối lệnh bị hủy. Đây là cách duy nhất để đọc rồi ghi có điều kiện một cách an toàn.
Độ phức tạp: O(1) cho mỗi keyTừ Redis 2.2.0
Ví dụ chạy được trong redis-cli
WATCH stock:sku-1001
UNWATCH
Transaction
UNWATCH
Gỡ theo dõi mọi key đang bị WATCH trên kết nối này. Được gọi ngầm sau mỗi lần EXEC hoặc DISCARD.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
UNWATCH
EVAL
Script
EVAL script numkeys key [key ...] arg [arg ...]
Chạy một đoạn Lua trên máy chủ một cách nguyên tử. Mọi key được đọc hay ghi phải khai báo trong phần numkeys để script chạy được trong cluster.
Độ phức tạp: Phụ thuộc vào nội dung scriptTừ Redis 2.6.0
Chạy script đã nạp sẵn trong bộ nhớ đệm bằng mã băm SHA1, tiết kiệm băng thông so với gửi cả nội dung script mỗi lần. Trả về lỗi NOSCRIPT nếu bộ đệm bị xóa.
Độ phức tạp: Phụ thuộc vào nội dung scriptTừ Redis 2.6.0
Xóa sạch bộ nhớ đệm script trên máy chủ. Mọi lời gọi EVALSHA đang chạy sẽ lập tức nhận lỗi NOSCRIPT.
Độ phức tạp: O(N) với N là số script trong bộ đệmTừ Redis 2.6.0
Ví dụ chạy được trong redis-cli
SCRIPT FLUSH ASYNC
Nên dùng thay thế
Đừng chạy SCRIPT FLUSH trên máy chủ đang phục vụ, mọi client dùng EVALSHA sẽ đồng loạt lỗi NOSCRIPT. Nếu chỉ cần bỏ một script cũ, hãy để nó nằm im vì bộ đệm rất nhẹ, hoặc dùng SCRIPT FLUSH ASYNC vào cửa sổ bảo trì sau khi đã đảm bảo client biết tự nạp lại script.
SCRIPT KILL
Script
SCRIPT KILL
Dừng script đang chạy quá lâu, chỉ hiệu quả khi script chưa thực hiện thao tác ghi nào. Nếu script đã ghi thì buộc phải dùng SHUTDOWN NOSAVE.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
SCRIPT KILL
FCALL
Script
FCALL function numkeys key [key ...] arg [arg ...]
Gọi một hàm trong thư viện Function đã nạp. Khác script, Function tồn tại lâu dài và được nhân bản sang bản sao cũng như lưu vào tệp bền vững.
Độ phức tạp: Phụ thuộc vào nội dung hàmTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
FCALL myfunc 1 mykey myvalue
FCALL_RO
Script
FCALL_RO function numkeys key [key ...] arg [arg ...]
Gọi hàm ở chế độ chỉ đọc, hàm phải được khai báo với cờ no-writes. Chạy được trên nút bản sao.
Độ phức tạp: Phụ thuộc vào nội dung hàmTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
FCALL_RO myfunc 1 mykey
FUNCTION LOAD
Script
FUNCTION LOAD [REPLACE] function-code
Nạp một thư viện Function vào máy chủ. Thư viện được ghi vào tệp bền vững và nhân bản sang bản sao nên không biến mất khi khởi động lại như script.
Độ phức tạp: O(1) cộng chi phí biên dịch mãTừ Redis 7.0.0
Liệt kê các thư viện Function đã nạp cùng danh sách hàm và các cờ của chúng.
Độ phức tạp: O(N) với N là số hàm đã nạpTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
FUNCTION LIST WITHCODE
FUNCTION DUMP
Script
FUNCTION DUMP
Xuất toàn bộ thư viện Function ra dạng nhị phân để sao lưu hoặc chuyển sang máy chủ khác qua FUNCTION RESTORE.
Độ phức tạp: O(N) với N là số hàm đã nạpTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
FUNCTION DUMP
FUNCTION FLUSH
Script
Nguy hiểm trên production
FUNCTION FLUSH [ASYNC|SYNC]
Xóa toàn bộ thư viện Function khỏi máy chủ. Mọi lời gọi FCALL sau đó đều lỗi.
Độ phức tạp: O(N) với N là số hàm đã nạpTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
FUNCTION FLUSH ASYNC
Nên dùng thay thế
Hãy chạy FUNCTION DUMP để sao lưu trước, rồi chỉ gỡ đúng thư viện cần bỏ bằng FUNCTION DELETE tên-thư-viện thay vì xóa sạch.
INFO
Server
INFO [section]
Trả về báo cáo trạng thái máy chủ theo từng phần: server, clients, memory, persistence, stats, replication, cpu, keyspace. Đây là lệnh chẩn đoán đầu tiên nên chạy khi có sự cố.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
INFO memory
DBSIZE
Server
DBSIZE
Đếm số key trong cơ sở dữ liệu hiện tại. Nhanh vì Redis lưu sẵn con số, hãy dùng thay cho việc đếm bằng KEYS.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DBSIZE
FLUSHDB
Server
Nguy hiểm trên production
FLUSHDB [ASYNC|SYNC]
Xóa sạch mọi key trong cơ sở dữ liệu hiện tại. Không có bước xác nhận và không hoàn tác được.
Độ phức tạp: O(N) với N là số key trong cơ sở dữ liệuTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
FLUSHDB ASYNC
Nên dùng thay thế
Đừng bao giờ chạy trên môi trường thật. Nếu chỉ cần dọn một nhóm key, hãy dùng SCAN 0 MATCH tiền-tố:* COUNT 100 rồi UNLINK theo từng lô. Nếu buộc phải xóa cả cơ sở dữ liệu, dùng FLUSHDB ASYNC để việc thu hồi bộ nhớ chạy ở luồng nền và vô hiệu hóa lệnh này bằng rename-command trong tệp cấu hình.
FLUSHALL
Server
Nguy hiểm trên production
FLUSHALL [ASYNC|SYNC]
Xóa sạch mọi key trên tất cả cơ sở dữ liệu của máy chủ. Lệnh còn được nhân bản sang mọi nút bản sao.
Độ phức tạp: O(N) với N là tổng số key trên máy chủTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
FLUSHALL ASYNC
Nên dùng thay thế
Đây là lệnh xóa toàn bộ dữ liệu, kể cả trên bản sao. Hãy vô hiệu hóa bằng rename-command FLUSHALL "" trong tệp cấu hình môi trường thật. Nếu buộc phải chạy, dùng FLUSHALL ASYNC và chỉ chạy sau khi đã có bản sao lưu bằng BGSAVE.
SAVE
Server
Nguy hiểm trên production
SAVE
Ghi ảnh chụp bộ nhớ ra tệp RDB ngay trong tiến trình chính. Máy chủ ngừng phục vụ mọi client cho tới khi ghi xong.
Độ phức tạp: O(N) với N là số key trong bộ nhớTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SAVE
Nên dùng thay thế
Dùng BGSAVE, nó fork một tiến trình con để ghi RDB trong khi máy chủ vẫn phục vụ bình thường. SAVE chỉ nên dùng khi máy chủ đã ngừng nhận lưu lượng và bạn cần một ảnh chụp chắc chắn trước khi tắt.
BGSAVE
Server
BGSAVE [SCHEDULE]
Ghi ảnh chụp RDB ở tiến trình con thông qua fork, máy chủ vẫn phục vụ bình thường. Cần lưu ý fork tạm thời tăng dung lượng bộ nhớ do sao chép trang khi ghi.
Độ phức tạp: O(1) cho lời gọi, tiến trình con làm việc nặng ở nềnTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
BGSAVE
BGREWRITEAOF
Server
BGREWRITEAOF
Viết lại tệp AOF ở tiến trình nền để nén lịch sử ghi thành trạng thái hiện tại, giúp AOF nhỏ lại và khởi động lại nhanh hơn.
Độ phức tạp: O(1) cho lời gọi, tiến trình con làm việc nặng ở nềnTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
BGREWRITEAOF
LASTSAVE
Server
LASTSAVE
Trả về dấu thời gian Unix của lần ghi RDB thành công gần nhất. So sánh trước và sau BGSAVE để biết ảnh chụp đã hoàn tất.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
LASTSAVE
CONFIG GET
Server
CONFIG GET parameter [parameter ...]
Đọc giá trị tham số cấu hình đang chạy, hỗ trợ ký tự đại diện. Cách nhanh nhất kiểm tra maxmemory và chính sách loại bỏ đang đặt là gì.
Độ phức tạp: O(N) với N là số tham số khớpTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
CONFIG GET maxmemory maxmemory-policy
CONFIG SET
Server
Nguy hiểm trên production
CONFIG SET parameter value [parameter value ...]
Đổi tham số cấu hình ngay lập tức mà không cần khởi động lại. Thay đổi chỉ nằm trong bộ nhớ, mất khi khởi động lại nếu không gọi CONFIG REWRITE.
Độ phức tạp: O(N) với N là số tham số được đặtTừ Redis 2.0.0
Ví dụ chạy được trong redis-cli
CONFIG SET maxmemory-policy allkeys-lru
Nên dùng thay thế
Một dòng gõ nhầm có thể tắt bền vững hoặc đặt maxmemory quá thấp làm hàng loạt key bị loại bỏ tức thì. Hãy CONFIG GET để ghi lại giá trị cũ trước, đổi trên môi trường thử trước, và sửa thẳng vào tệp redis.conf rồi khởi động lại theo quy trình khi thay đổi mang tính lâu dài.
CONFIG RESETSTAT
Server
CONFIG RESETSTAT
Đặt lại các bộ đếm thống kê mà INFO báo cáo, ví dụ số lệnh đã xử lý và số lần trúng đệm. Tiện khi muốn đo một khoảng thời gian sạch.
Độ phức tạp: O(1)Từ Redis 2.0.0
Ví dụ chạy được trong redis-cli
CONFIG RESETSTAT
CONFIG REWRITE
Server
CONFIG REWRITE
Ghi cấu hình đang chạy trở lại tệp redis.conf để các thay đổi bằng CONFIG SET còn hiệu lực sau khi khởi động lại.
Độ phức tạp: O(1)Từ Redis 2.8.0
Ví dụ chạy được trong redis-cli
CONFIG REWRITE
CLIENT LIST
Server
CLIENT LIST [TYPE normal|master|replica|pubsub] [ID id ...]
Liệt kê mọi kết nối đang mở kèm địa chỉ, thời gian nhàn rỗi, lệnh cuối cùng và kích thước bộ đệm đầu ra. Dùng để tìm client nào đang giữ kết nối treo.
Độ phức tạp: O(N) với N là số kết nốiTừ Redis 2.4.0
Đóng cưỡng bức một hoặc nhiều kết nối theo bộ lọc. Bộ lọc rộng có thể ngắt hàng loạt kết nối đang phục vụ thật.
Độ phức tạp: O(N) với N là số kết nốiTừ Redis 2.4.0
Ví dụ chạy được trong redis-cli
CLIENT KILL ID 42
Nên dùng thay thế
Chạy CLIENT LIST trước để xác định đúng ID cần ngắt, rồi CLIENT KILL ID số-cụ-thể thay vì lọc theo TYPE hay ADDR dạng rộng. Với vấn đề lệnh chạy lâu, hãy xử lý gốc bằng SLOWLOG GET thay vì ngắt kết nối.
CLIENT ID
Server
CLIENT ID
Trả về mã định danh của kết nối hiện tại. Mã này tăng đơn điệu nên có thể dùng để so sánh thứ tự kết nối.
Độ phức tạp: O(1)Từ Redis 5.0.0
Ví dụ chạy được trong redis-cli
CLIENT ID
CLIENT NO-EVICT
Server
CLIENT NO-EVICT on|off
Loại kết nối hiện tại khỏi cơ chế loại bỏ client khi bộ nhớ dành cho client vượt ngưỡng. Dùng cho kết nối quản trị cần luôn sống.
Độ phức tạp: O(1)Từ Redis 7.0.0
Ví dụ chạy được trong redis-cli
CLIENT NO-EVICT on
CLIENT UNPAUSE
Server
CLIENT UNPAUSE
Hủy trạng thái tạm dừng do CLIENT PAUSE đặt ra, cho các client tiếp tục gửi lệnh ngay lập tức.
Độ phức tạp: O(N) với N là số kết nốiTừ Redis 6.2.0
Ví dụ chạy được trong redis-cli
CLIENT UNPAUSE
COMMAND
Server
COMMAND
Trả về chi tiết mọi lệnh mà máy chủ hỗ trợ, gồm số tham số, các cờ và vị trí key. Thư viện client dùng lệnh này để định tuyến key trong cluster.
Độ phức tạp: O(N) với N là tổng số lệnhTừ Redis 2.8.13
Ví dụ chạy được trong redis-cli
COMMAND COUNT
COMMAND COUNT
Server
COMMAND COUNT
Đếm tổng số lệnh máy chủ hỗ trợ. Con số này tăng khi bạn nạp thêm mô đun.
Độ phức tạp: O(1)Từ Redis 2.8.13
Ví dụ chạy được trong redis-cli
COMMAND COUNT
COMMAND DOCS
Server
COMMAND DOCS [command-name ...]
Trả về tài liệu của lệnh ngay từ máy chủ, gồm mô tả, nhóm, phiên bản bắt đầu có và cấu trúc tham số.
Độ phức tạp: O(N) với N là số lệnh truy vấnTừ Redis 7.0.0
Ví dụ chạy được trong redis-cli
COMMAND DOCS GET
MEMORY USAGE
Server
MEMORY USAGE key [SAMPLES n]
Ước lượng số byte một key chiếm trong bộ nhớ, kể cả phần chi phí quản lý. Với tập hợp lớn, tham số SAMPLES quyết định lấy mẫu bao nhiêu phần tử.
Độ phức tạp: O(N) với N là số mẫu lấy raTừ Redis 4.0.0
Ví dụ chạy được trong redis-cli
MEMORY USAGE user:1 SAMPLES 0
MEMORY DOCTOR
Server
MEMORY DOCTOR
Trả về báo cáo dạng câu chữ về các vấn đề bộ nhớ mà Redis tự phát hiện, ví dụ tỷ lệ phân mảnh cao hay bộ đệm client phình to.
Độ phức tạp: O(1)Từ Redis 4.0.0
Ví dụ chạy được trong redis-cli
MEMORY DOCTOR
MEMORY STATS
Server
MEMORY STATS
Báo cáo chi tiết cách bộ nhớ được phân bổ: dữ liệu, bộ đệm client, bộ đệm nhân bản, chi phí bảng băm, tỷ lệ phân mảnh.
Độ phức tạp: O(1)Từ Redis 4.0.0
Ví dụ chạy được trong redis-cli
MEMORY STATS
SLOWLOG GET
Server
SLOWLOG GET [count]
Lấy các lệnh chạy vượt ngưỡng slowlog-log-slower-than kèm thời gian thực thi và tham số. Đây là nơi đầu tiên cần nhìn khi độ trễ tăng đột biến.
Độ phức tạp: O(N) với N là số mục lấy raTừ Redis 2.2.12
Ví dụ chạy được trong redis-cli
SLOWLOG GET 10
SLOWLOG RESET
Server
SLOWLOG RESET
Xóa sạch nhật ký lệnh chậm. Hãy chạy sau khi đã ghi nhận kết quả, để lần đo tiếp theo bắt đầu từ trạng thái sạch.
Độ phức tạp: O(N) với N là số mục trong nhật kýTừ Redis 2.2.12
Ví dụ chạy được trong redis-cli
SLOWLOG RESET
SLOWLOG LEN
Server
SLOWLOG LEN
Đếm số mục hiện có trong nhật ký lệnh chậm, giới hạn bởi tham số slowlog-max-len.
Độ phức tạp: O(1)Từ Redis 2.2.12
Ví dụ chạy được trong redis-cli
SLOWLOG LEN
MONITOR
Server
Nguy hiểm trên production
MONITOR
Phát trực tiếp mọi lệnh máy chủ đang xử lý về kết nối này. Trên máy chủ có lưu lượng thật, lệnh này làm sụt khoảng một nửa thông lượng.
Độ phức tạp: O(N) với N là số lệnh máy chủ đang xử lýTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
MONITOR
Nên dùng thay thế
Dùng SLOWLOG GET 20 để tìm lệnh chậm, redis-cli --bigkeys để tìm key phình to, redis-cli --hotkeys để tìm key bị truy cập nhiều, và redis-cli --stat để xem thông lượng theo giây. Nếu buộc phải dùng MONITOR, chỉ chạy vài giây rồi thoát ngay bằng Ctrl+C.
ACL WHOAMI
Server
ACL WHOAMI
Trả về tên người dùng gắn với kết nối hiện tại. Lệnh đầu tiên nên chạy khi gặp lỗi NOPERM.
Độ phức tạp: O(1)Từ Redis 6.0.0
Ví dụ chạy được trong redis-cli
ACL WHOAMI
ACL LIST
Server
ACL LIST
Liệt kê toàn bộ quy tắc ACL dưới dạng giống cú pháp trong tệp cấu hình, gồm quyền lệnh và mẫu key mỗi người dùng được phép chạm tới.
Độ phức tạp: O(N) với N là số người dùng đã khai báoTừ Redis 6.0.0
Ví dụ chạy được trong redis-cli
ACL LIST
ACL SETUSER
Server
ACL SETUSER username [rule ...]
Tạo hoặc sửa quyền của một người dùng: bật tắt tài khoản, đặt mật khẩu, giới hạn lệnh và mẫu key được phép truy cập.
Độ phức tạp: O(N) với N là số quy tắc truyền vàoTừ Redis 6.0.0
Ví dụ chạy được trong redis-cli
ACL SETUSER reader on >secret123 ~cache:* +@read
ACL GETUSER
Server
ACL GETUSER username
Xem chi tiết quyền của một người dùng dưới dạng có cấu trúc, tiện để kiểm tra vì sao một lệnh bị chặn.
Độ phức tạp: O(N) với N là số quy tắc của người dùngTừ Redis 6.0.0
Ví dụ chạy được trong redis-cli
ACL GETUSER default
LATENCY DOCTOR
Server
LATENCY DOCTOR
Phân tích các sự kiện độ trễ đã ghi nhận và đưa ra chẩn đoán dạng câu chữ kèm gợi ý khắc phục. Cần bật latency-monitor-threshold trước.
Độ phức tạp: O(1)Từ Redis 2.8.13
Ví dụ chạy được trong redis-cli
LATENCY DOCTOR
LATENCY RESET
Server
LATENCY RESET [event ...]
Xóa dữ liệu theo dõi độ trễ cho một hoặc mọi loại sự kiện, để bắt đầu một chu kỳ đo mới.
Độ phức tạp: O(1)Từ Redis 2.8.13
Ví dụ chạy được trong redis-cli
LATENCY RESET
SHUTDOWN
Server
Nguy hiểm trên production
SHUTDOWN [NOSAVE|SAVE] [NOW] [FORCE] [ABORT]
Tắt máy chủ. Mặc định Redis cố ghi RDB nếu có cấu hình save, còn NOSAVE tắt ngay lập tức và mọi dữ liệu chưa ghi xuống đĩa sẽ mất.
Độ phức tạp: O(N) khi có ghi RDB trước lúc tắtTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SHUTDOWN SAVE
Nên dùng thay thế
Không bao giờ gõ SHUTDOWN NOSAVE trên máy chủ thật trừ khi đang gỡ một script bị treo sau khi đã ghi dữ liệu. Hãy dùng SHUTDOWN SAVE, hoặc BGSAVE rồi kiểm tra LASTSAVE trước khi tắt qua trình quản lý dịch vụ của hệ điều hành.
SWAPDB
Server
Nguy hiểm trên production
SWAPDB index1 index2
Hoán đổi tức thì nội dung hai cơ sở dữ liệu. Mọi client đang kết nối lập tức nhìn thấy tập dữ liệu khác mà không hề được báo trước.
Độ phức tạp: O(N) với N là số key trong hai cơ sở dữ liệuTừ Redis 4.0.0
Ví dụ chạy được trong redis-cli
SWAPDB 0 1
Nên dùng thay thế
Trong mẫu dựng lại đệm rồi hoán đổi, hãy dùng tiền tố key có đánh số phiên bản như cache:v2:* và chuyển hướng ứng dụng sang tiền tố mới, sau đó xóa tiền tố cũ theo lô bằng SCAN và UNLINK. Cách này có thể quay lui, còn SWAPDB thì không.
REPLICAOF
Server
REPLICAOF host port | REPLICAOF NO ONE
Biến máy chủ thành bản sao của một máy chủ khác, hoặc cắt liên kết nhân bản để trở lại làm nút chính. Thay thế cho SLAVEOF từ Redis 5.0.
Độ phức tạp: O(1) cho lời gọi, việc đồng bộ chạy ở nềnTừ Redis 5.0.0
Ví dụ chạy được trong redis-cli
REPLICAOF NO ONE
WAIT
Server
WAIT numreplicas timeout
Chờ cho tới khi các lệnh ghi trước đó được xác nhận bởi số bản sao chỉ định hoặc hết thời gian chờ. Tăng độ bền cho thao tác ghi quan trọng nhưng không phải cam kết tuyệt đối.
Độ phức tạp: O(1)Từ Redis 3.0.0
Ví dụ chạy được trong redis-cli
WAIT 1 1000
TIME
Server
TIME
Trả về thời gian của máy chủ dưới dạng cặp giây Unix và micro giây. Dùng làm nguồn thời gian thống nhất cho nhiều ứng dụng client.
Độ phức tạp: O(1)Từ Redis 2.6.0
Ví dụ chạy được trong redis-cli
TIME
DEBUG OBJECT
Server
Nguy hiểm trên production
DEBUG OBJECT key
Trả về thông tin nội bộ của một key: độ dài tuần tự hóa, cách mã hóa, số phần tử. Lệnh dành cho gỡ lỗi, không có cam kết ổn định giữa các phiên bản.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DEBUG OBJECT user:1
Nên dùng thay thế
Dùng OBJECT ENCODING để biết cách mã hóa và MEMORY USAGE key để biết dung lượng. Đây là các lệnh công khai, ổn định giữa các phiên bản và an toàn hơn nhóm DEBUG.
DEBUG SLEEP
Server
Nguy hiểm trên production
DEBUG SLEEP seconds
Bắt tiến trình Redis ngủ đúng số giây chỉ định, dùng để mô phỏng tình huống máy chủ treo khi kiểm thử thời gian chờ và cơ chế thử lại của ứng dụng.
Độ phức tạp: O(1) nhưng chặn toàn bộ máy chủ suốt thời gian ngủTừ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DEBUG SLEEP 0.1
Nên dùng thay thế
Chỉ chạy trên máy chủ kiểm thử. Redis xử lý lệnh trên một luồng duy nhất nên lệnh này treo mọi kết nối khác đúng bằng số giây đã nhập, gõ nhầm 60 thay vì 0.6 là tự tạo ra một phút mất dịch vụ. Muốn thử ứng dụng chịu độ trễ ra sao thì chèn độ trễ ở tầng mạng, hoặc dùng SLOWLOG GET để xem lệnh nào đang thực sự chậm.
DEBUG SEGFAULT
Server
Nguy hiểm trên production
DEBUG SEGFAULT
Cố tình làm tiến trình Redis đổ vỡ để kiểm thử cơ chế phục hồi. Máy chủ chết ngay lập tức, mọi dữ liệu chưa ghi xuống đĩa sẽ mất.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
DEBUG SEGFAULT
Nên dùng thay thế
Chỉ chạy trên máy chủ dùng riêng cho kiểm thử. Muốn diễn tập chuyển đổi dự phòng trên môi trường thật, hãy dùng lệnh failover của Sentinel hoặc CLUSTER FAILOVER, và vô hiệu hóa nhóm DEBUG bằng enable-debug-command no trong tệp cấu hình.
LOLWUT
Server
LOLWUT [VERSION n]
Vẽ một tác phẩm nghệ thuật ký tự thay đổi theo từng bản Redis. Trên thực tế lệnh này hữu ích để xác nhận nhanh phiên bản máy chủ đang chạy.
Độ phức tạp: O(1)Từ Redis 5.0.0
Ví dụ chạy được trong redis-cli
LOLWUT
AUTH
Connection
AUTH [username] password
Xác thực kết nối. Từ Redis 6.0 có thể truyền kèm tên người dùng ACL, nếu chỉ truyền mật khẩu thì áp cho người dùng default.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
AUTH default mypassword
PING
Connection
PING [message]
Kiểm tra kết nối còn sống, trả về PONG hoặc chính chuỗi bạn truyền vào. Dùng cho kiểm tra sức khỏe và đo vòng đi mạng.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
PING
ECHO
Connection
ECHO message
Trả về đúng chuỗi được truyền vào. Hữu ích khi gỡ lỗi thư viện client hoặc kiểm tra pipeline.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
ECHO hello
SELECT
Connection
SELECT index
Chuyển kết nối sang một cơ sở dữ liệu khác, mặc định có 16 cơ sở dữ liệu đánh số từ 0. Không dùng được trong chế độ cluster.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
SELECT 1
QUIT
Connection
QUIT
Yêu cầu máy chủ đóng kết nối sau khi đã gửi hết các phản hồi đang chờ. Từ Redis 7.2 lệnh bị đánh dấu cũ, client nên tự đóng socket.
Độ phức tạp: O(1)Từ Redis 1.0.0
Ví dụ chạy được trong redis-cli
QUIT
RESET
Connection
RESET
Đưa kết nối về trạng thái ban đầu: hủy MULTI đang mở, gỡ WATCH, thoát chế độ đăng ký, quay về cơ sở dữ liệu 0 và bỏ xác thực.
Bắt tay giao thức và chuyển sang RESP3 nếu truyền số 3, đồng thời trả về thông tin máy chủ. Có thể gộp cả xác thực và đặt tên kết nối vào một lệnh.
Độ phức tạp: O(1)Từ Redis 6.0.0
Ví dụ chạy được trong redis-cli
HELLO 3
CLIENT SETNAME
Connection
CLIENT SETNAME connection-name
Đặt tên cho kết nối hiện tại, tên này hiện trong CLIENT LIST. Đặt tên theo tên dịch vụ giúp truy vết nguồn gây tải nhanh hơn rất nhiều.
Độ phức tạp: O(1)Từ Redis 2.6.9
Ví dụ chạy được trong redis-cli
CLIENT SETNAME worker-email-1
CLIENT GETNAME
Connection
CLIENT GETNAME
Đọc tên đã đặt cho kết nối hiện tại, trả về chuỗi rỗng nếu chưa đặt.
Độ phức tạp: O(1)Từ Redis 2.6.9
Ví dụ chạy được trong redis-cli
CLIENT GETNAME
CLIENT INFO
Connection
CLIENT INFO
Trả về một dòng thông tin về chính kết nối hiện tại theo đúng định dạng của CLIENT LIST.
Độ phức tạp: O(1)Từ Redis 6.2.0
Ví dụ chạy được trong redis-cli
CLIENT INFO
PFADD
HyperLogLog
PFADD key [element [element ...]]
Thêm phần tử vào cấu trúc đếm xấp xỉ. Bộ nhớ luôn dưới 12 kilobyte cho mỗi key bất kể bạn thêm bao nhiêu phần tử, đổi lại sai số khoảng 0,81 phần trăm.
Độ phức tạp: O(1) cho mỗi phần tửTừ Redis 2.8.9
Ví dụ chạy được trong redis-cli
PFADD visitors:2026-08-16 user-1 user-2 user-3
PFCOUNT
HyperLogLog
PFCOUNT key [key ...]
Ước lượng số phần tử duy nhất, khi truyền nhiều key thì trả về ước lượng cho hợp của chúng. Đây là cách đếm khách truy cập duy nhất rẻ nhất về bộ nhớ.
Độ phức tạp: O(1) với một key, O(N) khi hợp nhiều keyTừ Redis 2.8.9
Ví dụ chạy được trong redis-cli
PFCOUNT visitors:2026-08-16
PFMERGE
HyperLogLog
PFMERGE destkey [sourcekey ...]
Gộp nhiều cấu trúc đếm xấp xỉ vào một key đích. Dùng để cộng dồn số liệu theo ngày thành số liệu theo tuần hoặc theo tháng.
Độ phức tạp: O(N) với N là số key nguồnTừ Redis 2.8.9
Trả về chuỗi geohash 11 ký tự chuẩn của các thành viên, tương thích với các dịch vụ bản đồ dùng geohash công khai.
Độ phức tạp: O(1) cho mỗi thành viênTừ Redis 3.2.0
Ví dụ chạy được trong redis-cli
GEOHASH stores store-hcm
GEORADIUS
Geo
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT n [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
Tìm điểm trong bán kính quanh một tọa độ. Đã bị đánh dấu cũ từ Redis 6.2, mã mới nên dùng GEOSEARCH.
Độ phức tạp: O(N+log(M)) với N là số điểm trong vùng và M là số điểm trong chỉ mụcTừ Redis 3.2.0
Ví dụ chạy được trong redis-cli
GEORADIUS stores 106.700424 10.775658 50 km ASC COUNT 10
GEORADIUSBYMEMBER
Geo
GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT n [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
Tìm điểm trong bán kính quanh một thành viên đã có trong chỉ mục. Cũng bị đánh dấu cũ từ Redis 6.2, nên chuyển sang GEOSEARCH với FROMMEMBER.
Độ phức tạp: O(N+log(M)) với N là số điểm trong vùng và M là số điểm trong chỉ mụcTừ Redis 3.2.0
Ví dụ chạy được trong redis-cli
GEORADIUSBYMEMBER stores store-hcm 50 km ASC COUNT 10
SETBIT
Bitmap
SETBIT key offset value
Đặt giá trị 0 hoặc 1 cho một bit tại vị trí chỉ định, chuỗi tự giãn ra nếu cần. Đặt bit ở vị trí rất lớn sẽ cấp phát ngay toàn bộ vùng nhớ tới vị trí đó.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
SETBIT active:2026-08-16 1001 1
GETBIT
Bitmap
GETBIT key offset
Đọc giá trị bit tại vị trí chỉ định, trả về 0 nếu vị trí nằm ngoài độ dài chuỗi hiện có.
Độ phức tạp: O(1)Từ Redis 2.2.0
Ví dụ chạy được trong redis-cli
GETBIT active:2026-08-16 1001
BITCOUNT
Bitmap
BITCOUNT key [start end [BYTE|BIT]]
Đếm số bit bằng 1 trong toàn chuỗi hoặc trong một khoảng. Đây là cách đếm số người dùng hoạt động trong ngày với chi phí bộ nhớ cực thấp.
Độ phức tạp: O(N) với N là số byte phải quétTừ Redis 2.6.0
Ví dụ chạy được trong redis-cli
BITCOUNT active:2026-08-16
BITPOS
Bitmap
BITPOS key bit [start [end [BYTE|BIT]]]
Tìm vị trí bit đầu tiên có giá trị 0 hoặc 1 trong chuỗi, có thể giới hạn theo khoảng byte hoặc bit.
Độ phức tạp: O(N) với N là số byte phải quétTừ Redis 2.8.7
Ví dụ chạy được trong redis-cli
BITPOS active:2026-08-16 1
BITOP
Bitmap
BITOP AND|OR|XOR|NOT destkey key [key ...]
Thực hiện phép toán bit giữa nhiều chuỗi và lưu kết quả vào key đích. Cách chuẩn tính người dùng hoạt động liên tục nhiều ngày bằng phép AND các bản đồ bit theo ngày.
Độ phức tạp: O(N) với N là độ dài chuỗi dài nhấtTừ Redis 2.6.0
Ví dụ chạy được trong redis-cli
BITOP AND active:both active:2026-08-15 active:2026-08-16
BITFIELD
Bitmap
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
Coi chuỗi như một mảng số nguyên có độ rộng bit tùy ý, đọc ghi và cộng dồn từng ô. Cho phép nhồi nhiều bộ đếm nhỏ vào một key duy nhất.
Độ phức tạp: O(1) cho mỗi lệnh conTừ Redis 3.2.0
Ví dụ chạy được trong redis-cli
BITFIELD counters INCRBY u8 0 1 GET u8 0
BITFIELD_RO
Bitmap
BITFIELD_RO key GET type offset [GET type offset ...]
Bản chỉ đọc của BITFIELD, chỉ chấp nhận lệnh con GET nên chạy được trên nút bản sao.
Chúng tôi không chỉ thiết kế website, mà còn giúp doanh nghiệp xây dựng thương hiệu số mạnh mẽ. Cung cấp dịch vụ thiết kế website trọn gói từ thiết kế đến tối ưu SEO. Hãy liên hệ ngay với Tấn Phát Digital để cùng tạo nên những giải pháp công nghệ đột phá, hiệu quả và bền vững cho doanh nghiệp của bạn tại Hồ Chí Minh.
Tra cứu lệnh Redis: cú pháp, độ phức tạp, phiên bản và ví dụ chạy được
Bảng tra hơn 260 lệnh Redis gom theo kiểu dữ liệu, mỗi lệnh có cú pháp đầy đủ kèm tham số tùy chọn, giải thích tiếng Việt, độ phức tạp thời gian, phiên bản Redis bắt đầu có và một ví dụ dán thẳng vào redis-cli. Các lệnh có thể làm treo máy chủ thật được đánh dấu riêng kèm lệnh nên dùng thay.
Tính năng nổi bật
Hơn 260 lệnh chia theo 15 nhóm: string, list, set, sorted set, hash, key, stream, pub/sub, transaction, script, server, connection, bitmap, HyperLogLog và geo
Mỗi lệnh có đủ năm thông tin: cú pháp đầy đủ, giải thích tiếng Việt, độ phức tạp thời gian, phiên bản Redis bắt đầu có và ví dụ chạy được
Ô tìm kiếm quét cùng lúc tên lệnh, cú pháp và phần mô tả nên gõ được cả từ khóa tiếng Việt
Bộ lọc theo nhóm dữ liệu, bấm một nút là chỉ còn lệnh của kiểu dữ liệu đang quan tâm
Nút lọc riêng chỉ hiện các lệnh nguy hiểm trên môi trường thật, kèm số lượng ngay trên nút
Lệnh nguy hiểm được viền đỏ và có khối riêng ghi rõ lệnh nên dùng thay thế, ví dụ SCAN thay KEYS và UNLINK thay DEL với key lớn
Nút sao chép ví dụ của từng lệnh để dán thẳng vào redis-cli mà không phải gõ lại
Toàn bộ dữ liệu nằm sẵn trong trang, tra cứu chạy hoàn toàn trên trình duyệt và không gọi máy chủ nào
Vì sao cần một bảng tra có cả độ phức tạp và phiên bản
Phần lớn bảng tra lệnh Redis chỉ ghi lệnh làm gì. Điều đó đủ khi bạn học, nhưng không đủ khi bạn viết mã chạy thật. Redis xử lý lệnh trên một luồng duy nhất, nên một lệnh có độ phức tạp tuyến tính chạy trên key hàng triệu phần tử sẽ chặn toàn bộ máy chủ trong suốt thời gian đó, mọi client khác phải xếp hàng chờ. Đội vận hành nhìn ra ngoài chỉ thấy độ trễ tăng vọt mà không hiểu vì đâu. Con số độ phức tạp đặt ngay cạnh lệnh giúp bạn nhận ra rủi ro trước khi đẩy mã lên, chứ không phải sau khi có sự cố. Trường phiên bản bắt đầu có cũng quan trọng không kém: rất nhiều hệ thống ở Việt Nam vẫn chạy Redis 5 hoặc 6 do dùng bản đóng gói sẵn của nhà cung cấp máy chủ, trong khi tài liệu trên mạng thường viết theo bản mới nhất. Biết LMOVE cần 6.2 và LMPOP cần 7.0 giúp bạn không viết xong mới phát hiện máy chủ báo lỗi không nhận lệnh.
Lợi ích khi sử dụng
•Biết trước lệnh nào có thể làm treo máy chủ thay vì phát hiện khi hệ thống đã chậm
•Tra nhanh phiên bản tối thiểu cần có, tránh viết mã máy chủ không chạy được
•Gom theo kiểu dữ liệu nên tìm ra lệnh phù hợp ngay cả khi chưa nhớ tên
•Ví dụ dán thẳng vào redis-cli, không phải tự dựng lại tham số
•Có sẵn lệnh thay thế an toàn cho từng lệnh nguy hiểm, dùng được làm quy ước cho cả nhóm phát triển
•Chạy hoàn toàn trên trình duyệt, không cần cài công cụ và không gửi dữ liệu đi đâu
Cách tra cứu lệnh Redis trên trang này
1Gõ tên lệnh vào ô tìm kiếm nếu đã biết mình cần gì, ô này quét cả tên lệnh, chuỗi cú pháp và phần mô tả tiếng Việt.
2Chưa biết tên lệnh thì bấm nút nhóm tương ứng với kiểu dữ liệu đang dùng, chẳng hạn Sorted Set khi làm bảng xếp hạng hoặc Stream khi làm hàng đợi sự kiện.
3Đọc dòng cú pháp để biết tham số nào bắt buộc và tham số nào tùy chọn, phần trong ngoặc vuông là tùy chọn còn dấu gạch đứng nghĩa là chọn một trong các giá trị.
4Kiểm tra hai nhãn độ phức tạp và phiên bản trước khi đưa lệnh vào mã nguồn, nhất là khi key có thể phình lên hàng trăm nghìn phần tử.
5Bấm nút sao chép để lấy ví dụ, dán vào redis-cli trên môi trường thử nghiệm rồi mới đổi tên key thành key thật.
6Bấm nút chỉ hiện lệnh nguy hiểm khi rà soát mã của người khác hoặc khi viết tài liệu vận hành, phần này liệt kê sẵn lệnh nên dùng thay thế.
Redis chạy một luồng, nên độ phức tạp thời gian là chỉ số quan trọng nhất
Khác với cơ sở dữ liệu quan hệ chạy nhiều tiến trình song song, Redis xử lý toàn bộ lệnh trên một luồng duy nhất theo thứ tự nhận được. Điều này khiến mọi thao tác trở nên nguyên tử mà không cần khóa, đó là ưu điểm lớn. Nhưng nó cũng có nghĩa là không có khái niệm truy vấn chậm chỉ ảnh hưởng một người dùng: một lệnh chạy mất năm trăm mili giây sẽ làm mọi client khác chờ đúng năm trăm mili giây đó. Vì vậy con số độ phức tạp trong tài liệu Redis không phải kiến thức hàn lâm mà là cảnh báo vận hành trực tiếp. Lệnh O(1) như GET, SET, HGET, ZSCORE hay SISMEMBER luôn an toàn dù dữ liệu lớn tới đâu. Lệnh O(log N) như ZADD hay ZRANK vẫn rất tốt vì logarit tăng cực chậm. Nhóm cần cân nhắc là O(N): SMEMBERS, HGETALL, LRANGE với khoảng rộng, ZRANGE lấy cả tập, và đặc biệt KEYS quét toàn bộ không gian khóa. Với N vài trăm thì không sao, với N vài triệu thì đó là một sự cố. Quy tắc thực dụng là ước lượng N lớn nhất mà key có thể đạt tới sau một năm chạy thật, rồi mới quyết định dùng lệnh nào. Nếu N không chặn được thì phải đổi sang lệnh duyệt theo lô như SCAN, HSCAN, SSCAN và ZSCAN.
Sáu lệnh không nên gõ trên máy chủ thật và lệnh thay thế tương ứng
KEYS quét toàn bộ không gian khóa để tìm mẫu khớp và khóa máy chủ suốt quá trình đó, thay bằng SCAN với con trỏ và tham số COUNT để chia thành nhiều lát rất ngắn. FLUSHDB xóa sạch cơ sở dữ liệu đang chọn còn FLUSHALL xóa sạch mọi cơ sở dữ liệu, cả hai không hỏi lại và còn được nhân bản sang bản sao nên không thể khôi phục từ bản sao, thay bằng SCAN kết hợp UNLINK để dọn có chọn lọc. SHUTDOWN dừng hẳn tiến trình, kèm NOSAVE thì mất mọi thay đổi từ lần lưu gần nhất, hãy dừng dịch vụ qua công cụ quản lý của hệ điều hành. DEBUG SLEEP chặn máy chủ đúng số giây đã nhập, chỉ dùng trên máy kiểm thử. MONITOR sao chép mọi lệnh của mọi client ra một kết nối, làm thông lượng tụt tới quá nửa và lộ dữ liệu nhạy cảm trong tham số lệnh, thay bằng SLOWLOG GET để xem lệnh chậm hoặc INFO commandstats để xem phân bố lệnh. Ngoài sáu lệnh trên còn một trường hợp hay bị bỏ sót: DEL trên key rất lớn giải phóng bộ nhớ ngay trong luồng chính nên có thể chặn máy chủ, hãy dùng UNLINK để việc thu hồi chạy ở luồng nền. Cách bảo vệ chắc chắn nhất không phải là nhắc nhau cẩn thận mà là chặn ở cấu hình bằng rename-command hoặc phân quyền bằng ACL SETUSER với quy tắc trừ nhóm dangerous.
Chọn đúng kiểu dữ liệu trước, rồi mới chọn lệnh
Rất nhiều vấn đề hiệu năng của Redis bắt nguồn từ việc chọn sai kiểu dữ liệu chứ không phải viết sai lệnh. String hợp cho giá trị đơn lẻ, cache trang đã dựng sẵn và bộ đếm qua INCR. Hash hợp khi một đối tượng có nhiều trường và bạn chỉ cần đọc vài trường, vì HMGET rẻ hơn nhiều so với lấy cả đối tượng rồi phân tích. List là hàng đợi vào trước ra trước với cặp RPUSH và LPOP, hoặc hàng đợi tin cậy với LMOVE để công việc không bao giờ biến mất giữa chừng. Set dùng cho tập hợp không trùng lặp và các phép giao, hợp, hiệu ngay trong Redis. Sorted set là lựa chọn cho mọi thứ cần thứ tự theo điểm: bảng xếp hạng, hàng đợi ưu tiên với ZPOPMIN, hoặc giới hạn tần suất theo cửa sổ trượt bằng cách lấy dấu thời gian làm điểm rồi dọn bằng ZREMRANGEBYSCORE. Stream mới là thứ nên dùng cho hàng đợi sự kiện có nhiều nhóm tiêu thụ, vì nó lưu lại lịch sử và theo dõi mục chưa xác nhận, khác hẳn pub/sub vốn không lưu gì và client ngoại tuyến sẽ mất tin. Bitmap và HyperLogLog dành cho thống kê quy mô lớn với bộ nhớ rất nhỏ, còn geo dùng cho truy vấn theo bán kính. Chọn đúng ở bước này giúp bạn tránh được cảnh phải dùng lệnh O(N) chỉ vì cấu trúc dữ liệu không hợp việc.
Đọc cú pháp trong tài liệu Redis và kiểm chứng bằng chính máy chủ của bạn
Chuỗi cú pháp trong bảng tra viết theo đúng quy ước của tài liệu Redis. Chữ viết hoa là từ khóa phải gõ nguyên văn. Chữ thường là giá trị bạn thay vào. Phần đặt trong ngoặc vuông là tùy chọn, có thể bỏ hoàn toàn. Dấu gạch đứng nghĩa là chọn một trong các nhánh, ví dụ NX hoặc XX chứ không được cả hai. Ba dấu chấm nghĩa là phần trước đó lặp lại được nhiều lần. Cụm numkeys xuất hiện trong EVAL, ZUNIONSTORE, LMPOP và các lệnh nhiều key khác là số key bạn phải đếm và khai báo, đếm sai là lệnh hiểu nhầm đâu là key đâu là tham số, đây là lỗi phổ biến khi mới dùng script Lua. Nếu không chắc Redis coi tham số nào là key, hãy hỏi thẳng máy chủ bằng COMMAND GETKEYS kèm câu lệnh đầy đủ. Tương tự, từ Redis 7.0 bạn có thể dùng COMMAND DOCS để lấy tóm tắt, độ phức tạp và phiên bản của một lệnh ngay từ máy chủ đang chạy, con số này luôn đúng với bản bạn đang dùng. Thói quen tốt là mở một cơ sở dữ liệu logic riêng bằng SELECT hoặc một máy chủ thử nghiệm, chạy ví dụ ở đó, quan sát kết quả trả về rồi mới đưa vào mã nguồn.
Phiên bản Redis và những lệnh dễ khiến mã chạy được ở máy này mà hỏng ở máy khác
Trường phiên bản bắt đầu có trong bảng tra tồn tại vì một lý do rất thực tế: máy chủ của bạn hiếm khi chạy bản mới nhất. Nhiều nhà cung cấp máy chủ ảo vẫn đóng gói Redis 6 trong kho phần mềm mặc định, còn các bản Redis quản lý sẵn của nhà cung cấp đám mây thường cho chọn nhiều dòng phiên bản song song. Có vài mốc nên nhớ. Redis 4.0 mang đến UNLINK cho phép xóa key lớn ở luồng nền. Redis 5.0 giới thiệu kiểu stream với cả nhóm lệnh XADD, XREADGROUP và XACK. Redis 6.0 có phân quyền ACL và giao thức RESP3 qua lệnh HELLO. Redis 6.2 bổ sung rất nhiều lệnh thay thế cho các lệnh cũ: GETDEL, GETEX, COPY, LMOVE, ZRANGESTORE, GEOSEARCH và bản ZRANGE hợp nhất thay cho ZREVRANGE cùng ZRANGEBYSCORE. Redis 7.0 thêm nhóm lệnh nhiều key kiểu LMPOP, ZMPOP, SINTERCARD, cùng hệ thống hàm với FUNCTION LOAD và FCALL. Khi viết thư viện dùng chung cho nhiều dự án, hãy đặt phiên bản tối thiểu rõ ràng trong tài liệu và kiểm tra bằng INFO server ngay lúc khởi động, thay vì để lỗi lệnh không tồn tại nổ ra giữa giờ cao điểm. Với môi trường cụm, cần chú ý thêm rằng các lệnh nhiều key chỉ chạy khi mọi key nằm cùng một khe băm, nên phải dùng dấu ngoặc nhọn để ép chúng về chung phân mảnh.
Câu hỏi thường gặp (FAQ)
Vì sao không được dùng KEYS trên máy chủ thật?
Vì KEYS quét toàn bộ không gian khóa để tìm mẫu khớp, độ phức tạp O(N) với N là tổng số key. Redis xử lý lệnh trên một luồng duy nhất nên trong suốt thời gian quét, mọi client khác phải chờ. Với một triệu key, việc chờ này đủ dài để hệ thống báo lỗi hàng loạt. Hãy dùng SCAN 0 MATCH mẫu COUNT 100 rồi lặp theo con trỏ tới khi con trỏ quay về 0.
SCAN có đảm bảo trả về đủ và không trùng key không?
SCAN đảm bảo mọi key tồn tại suốt vòng duyệt đều xuất hiện ít nhất một lần, nhưng không đảm bảo không trùng, nên chương trình cần tự khử trùng lặp. Key được thêm hoặc xóa giữa chừng thì có thể xuất hiện hoặc không. Đổi lại, mỗi lần gọi chỉ tốn thời gian rất ngắn nên máy chủ không bị chặn. Tham số COUNT chỉ là gợi ý số lượng, không phải cam kết.
Khi nào phải dùng UNLINK thay cho DEL?
Khi key chứa nhiều phần tử, chẳng hạn một tập hợp hoặc hash hàng trăm nghìn tới hàng triệu mục. DEL giải phóng bộ nhớ ngay trong luồng chính nên thời gian xóa tỷ lệ với số phần tử bên trong. UNLINK có từ Redis 4.0 chỉ gỡ key khỏi không gian khóa còn việc thu hồi bộ nhớ đẩy sang luồng nền, nhờ vậy lệnh trả về gần như tức thì. Với key nhỏ thì hai lệnh tương đương nhau.
FLUSHALL và FLUSHDB khác nhau thế nào, lỡ chạy rồi có khôi phục được không?
FLUSHDB chỉ xóa cơ sở dữ liệu logic đang chọn, FLUSHALL xóa toàn bộ mọi cơ sở dữ liệu trên máy chủ. Cả hai đều được nhân bản sang bản sao nên bản sao cũng trống theo, không dùng để khôi phục được. Cách duy nhất là phục hồi từ tệp ảnh chụp hoặc tệp nhật ký ghi thêm nếu có bật, và mọi thay đổi sau thời điểm sao lưu đó vẫn mất. Nên vô hiệu hóa hai lệnh này bằng rename-command trên máy sản xuất.
Thay MONITOR bằng cách nào để xem Redis đang nhận lệnh gì?
Dùng SLOWLOG GET để đọc các lệnh vượt ngưỡng thời gian đặt trong cấu hình, đây là nơi lộ ra lệnh gây chậm. Dùng INFO commandstats để xem mỗi loại lệnh được gọi bao nhiêu lần và tốn tổng bao nhiêu thời gian. Dùng CLIENT LIST để biết kết nối nào đang chạy lệnh gì. Ba lệnh này gần như không tốn chi phí, còn MONITOR sao chép mọi lệnh ra một kết nối và có thể làm thông lượng tụt hơn một nửa.
Redis có transaction thật sự không, lỗi giữa chừng có quay lui được không?
MULTI và EXEC đảm bảo các lệnh trong khối chạy liên tiếp không xen kẽ lệnh của client khác, nhưng không có cơ chế quay lui. Nếu một lệnh trong khối lỗi lúc chạy, chẳng hạn sai kiểu dữ liệu, các lệnh còn lại vẫn chạy bình thường. Muốn có logic điều kiện thật sự thì viết script Lua chạy bằng EVAL, vì cả đoạn script chạy nguyên tử và bạn tự kiểm soát nhánh rẽ bên trong.
WATCH dùng để làm gì trong giao dịch Redis?
WATCH thực hiện khóa lạc quan. Bạn theo dõi một hoặc nhiều key, sau đó mở MULTI và xếp hàng các lệnh. Nếu có client khác sửa key đang theo dõi trước khi EXEC chạy thì EXEC trả về nil và không lệnh nào được thực hiện, chương trình phải tự đọc lại và thử lại. Đây là cách xử lý an toàn cho các tình huống đọc rồi ghi như trừ tồn kho, thay cho việc khóa bi quan.
Nên dùng pub/sub hay stream cho hàng đợi công việc?
Stream trong hầu hết trường hợp. Pub/sub không lưu thông điệp, client đang ngoại tuyến sẽ mất hoàn toàn tin gửi trong lúc đó và không có cách nào biết đã mất. Stream lưu lại lịch sử, hỗ trợ nhóm tiêu thụ qua XREADGROUP, theo dõi mục chưa xác nhận qua XPENDING và chuyển việc từ worker chết sang worker khác qua XCLAIM hoặc XAUTOCLAIM. Pub/sub chỉ hợp cho tín hiệu tức thời không quan trọng như xóa cache.
Làm sao biết Redis của tôi có hỗ trợ một lệnh cụ thể hay không?
Xem trường phiên bản bắt đầu có trong bảng tra rồi so với kết quả INFO server trên máy chủ của bạn. Cách chắc chắn hơn là hỏi thẳng máy chủ: COMMAND DOCS tên-lệnh từ Redis 7.0 trả về tài liệu ngay tại chỗ, còn COMMAND COUNT và COMMAND cho biết toàn bộ danh sách lệnh máy chủ hiện hỗ trợ, bao gồm cả lệnh do mô đun mở rộng thêm vào.
Cách nào chặn lập trình viên gõ nhầm lệnh nguy hiểm trên máy sản xuất?
Có hai lớp. Lớp cấu hình dùng rename-command trong tệp cấu hình để đổi tên hoặc vô hiệu hóa hẳn FLUSHALL, FLUSHDB, KEYS, SHUTDOWN, DEBUG và MONITOR. Lớp phân quyền từ Redis 6.0 dùng ACL SETUSER tạo tài khoản riêng cho ứng dụng với quy tắc chỉ cho phép nhóm lệnh cần thiết và trừ nhóm dangerous. Tài khoản quản trị đầy đủ chỉ giao cho người trực vận hành.
Vì sao lệnh nhiều key báo lỗi CROSSSLOT khi chạy Redis Cluster?
Vì trong chế độ cụm, mỗi key được băm về một khe rồi phân cho một nút. Các lệnh thao tác nhiều key như MGET, SINTERSTORE, ZUNIONSTORE hay EVAL chỉ chạy được khi mọi key nằm cùng một khe. Cách xử lý là dùng dấu ngoặc nhọn để chỉ định phần tên tham gia băm, ví dụ đặt tên user:{1001}:name và user:{1001}:email thì cả hai chắc chắn về cùng một nút.
Bảng tra này có gửi dữ liệu hay lệnh của tôi đi đâu không?
Không. Toàn bộ danh sách lệnh nằm sẵn trong trang, việc tìm kiếm và lọc chạy hoàn toàn bằng JavaScript trên trình duyệt của bạn. Trang không kết nối tới bất kỳ máy chủ Redis nào, không có ô nhập chuỗi kết nối và không lưu gì lại. Nút sao chép chỉ đưa ví dụ vào bộ nhớ tạm của máy bạn.