Strings là kiểu dữ liệu đơn giản nhất nhưng cũng mạnh mẽ nhất trong Redis. Hiểu rõ Strings là nền tảng để làm chủ Redis.

Strings là gì?
Trong Redis, String có thể chứa:
- Chuỗi văn bản:
"Hello World" - Số nguyên:
42 - Số thực:
3.14 - Binary data: Hình ảnh, file (tối đa 512MB)
# Lưu trữ các kiểu dữ liệu khác nhau
SET name "Tan" # Chuỗi
SET age 25 # Số nguyên
SET pi 3.14 # Số thực
SET avatar "\x89PNG..." # Binary
Các lệnh cơ bản
| Lệnh | Độ phức tạp | Ghi chú |
|---|---|---|
| GET / SET | O(N) | N = số key thao tác (1 key → O(1)) |
| MGET / MSET | O(N) | N = số key |
| INCR / DECR / INCRBY | O(1) | Thao tác nguyên tử trên 1 key |
| APPEND | O(N) | N = độ dài string sau khi nối |
| GETRANGE | O(N) | N = độ dài chuỗi con trả về |
| STRLEN | O(N) | N = độ dài string |
| SETRANGE | O(N) | N = độ dài string sau khi thay thế |
| SETEX | O(1) | Tương đương SET + EXPIRE |
SET và GET
# Đặt giá trị
SET user:1001:name "Tan"
SET user:1001:email "[email protected]"
# Lấy giá trị
GET user:1001:name
# "Tan"
# Đặt nhiều key cùng lúc
MSET user:1002:name "Linh" user:1002:age "28"
# Lấy nhiều key cùng lúc
MGET user:1001:name user:1002:name
# 1) "Tan"
# 2) "Linh"
SET với tùy chọn
# SET chỉ nếu key CHƯA tồn tại (NX)
SET lock:resource1 "locked" NX
# OK nếu key chưa tồn tại
# (nil) nếu key đã tồn tại
# SET chỉ nếu key ĐÃ tồn tại (XX)
SET user:1001:name "New Name" XX
# OK nếu key tồn tại
# (nil) nếu key không tồn tại
# SET với thời gian sống (EX - giây)
SET session:abc123 "user_data" EX 3600
# Key sẽ tự xóa sau 1 giờ
# SET với thời gian sống (PX - mili giây)
SET otp:123456 "verified" PX 300000
# Key sẽ tự xóa sau 5 phút
Thao tác với số
INCR / DECR
# Tăng giá trị lên 1
SET counter 10
INCR counter
# (integer) 11
# Tăng giá trị lên N
INCRBY counter 5
# (integer) 16
# Giảm giá trị
DECR counter
# (integer) 15
# Giảm giá trị N
DECRBY counter 3
# (integer) 12
Ứng dụng: Counter thời gian thực
# Đếm lượt xem trang
INCR page:homepage:views
# (integer) 1
# Đếm API calls
INCR api:users:get:2026-03-30
# Rate limiting - đếm request trong 1 phút
INCR rate:user:1001
EXPIRE rate:user:1001 60
# Nếu INCR > 100 → reject request
Thao tác chuỗi
# Nối chuỗi vào cuối
SET greeting "Hello"
APPEND greeting " World!"
# (integer) 12
GET greeting
# "Hello World!"
# Độ dài chuỗi
STRLEN greeting
# (integer) 12
# Lấy một phần chuỗi
SET message "Hello Redis World"
GETRANGE message 0 4
# "Hello"
GETRANGE message 6 10
# "Redis"
# Thay thế một phần chuỗi
SET message "Hello World"
SETRANGE message 6 "Redis"
# (integer) 11
GET message
# "Hello Redis"
Atomic Operations
Một trong những ưu điểm lớn nhất của Strings là các thao tác atomic — không có race condition.
# GETSET: Lấy giá trị cũ và đặt giá trị mới (atomic)
SET counter 100
GETSET counter 0
# "100" (giá trị cũ)
GET counter
# "0" (giá trị mới)
# SETNX + EXPIRE: Distributed Lock đơn giản
SET lock:order:1234 "process-1" NX EX 30
# OK nếu lock thành công
# (nil) nếu đã bị lock bởi process khác
Use Cases thực tế
1. Cache API Response
# Cache kết quả query trong 5 phút
SET cache:users:list "[{...}]" EX 300
# Kiểm tra cache trước khi query DB
cached = GET cache:users:list
if cached:
return cached
else:
result = db.query("SELECT * FROM users")
SET cache:users:list result EX 300
return result
2. Session Store
# Lưu session khi user đăng nhập
SET session:abc123 "{\"user_id\": 1001, \"role\": \"admin\"}" EX 86400
# Kiểm tra session
GET session:abc123
# Nếu (nil) → session hết hạn
# Xóa session khi đăng nhập
DEL session:abc123
3. OTP Verification
# Tạo OTP, hết hạn sau 5 phút
SET otp:+84901234567 "847291" PX 300000
# Xác thực OTP
otp = GET otp:+84901234567
if otp == "847291":
print("Xác thực thành công!")
DEL otp:+84901234567
else:
print("OTP sai hoặc đã hết hạn")
Memory và Performance
- Mỗi String key tốn khoảng ~100 bytes overhead
- Với số nhỏ, Redis tự động dùng integer encoding (tiết kiệm RAM)
- Giới hạn tối đa: 512MB cho một String value
Best Practices
- Dùng SET thay vì GET+SET — Tránh race condition
- Set TTL ngay khi tạo —
SET key value EX 3600 - Tránh value quá lớn — Strings > 512MB sẽ lỗi
- Dùng MGET/MSET — Batch operations hiệu quả hơn
- Dùng INCR cho counter — Atomic, thread-safe
Bước tiếp theo
Bạn đã nắm vững Strings trong Redis! Tiếp theo, chúng ta sẽ tìm hiểu về Lists — cấu trúc dữ liệu hoàn hảo cho queue và stack.