Strings trong Redis: Từ cơ bản đến nâng cao

Photo of author

Văn Ngọc Tân

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.

Redis Strings data type fundamental operations
Strings là kiểu dữ liệu cơ bản và linh hoạt nhất trong 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ạoSET 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.

👉 Bài tiếp theo: Lists trong Redis

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận