Keys & Expiration trong Redis: Quản lý vòng đời dữ liệu

Photo of author

Văn Ngọc Tân

Việc quản lý keysthời gian sống (TTL) là kỹ năng quan trọng khi làm việc với Redis. Bài viết này giúp bạn thành thạo các lệnh quản lý keys và expiration.

Quản lý Keys

Tìm kiếm Keys

# Tìm keys theo pattern
KEYS user:*          # Tất cả keys bắt đầu bằng "user:"
KEYS *:1001          # Tất cả keys chứa ":1001"
KEYS session:*       # Tất cả session keys

# ⚠️ CẢNH BÁO: KEYS quét TẤT CẢ keys trong RAM
# Không dùng trong production! Dùng SCAN thay thế.

SCAN: Tìm kiếm an toàn

SCAN tìm kiếm keys theo từng batch, không block server:

# SCAN cursor MATCH pattern COUNT batch_size
SCAN 0 MATCH user:* COUNT 100
# 1) "17"     → cursor cho lần tiếp theo
# 2) 1) "user:1001"
#    2) "user:1002"
#    ...

# Tiếp tục quét cho đến khi cursor = 0
cursor = 0
while True:
    cursor, keys = SCAN cursor MATCH "user:*" COUNT 100
    process(keys)
    if cursor == 0:
        break

Kiểm tra và xóa Keys

# Kiểm tra key tồn tại
EXISTS user:1001
# (integer) 1 nếu tồn tại
# (integer) 0 nếu không

# Kiểm tra kiểu dữ liệu
TYPE user:1001
# "string" hoặc "hash" hoặc "list" ...

# Xóa key
DEL user:1001
# (integer) 1 nếu xóa thành công

# Xóa nhiều keys
DEL user:1001 user:1002 user:1003

# Đổi tên key
RENAME user:1001 user:profile:1001

# Đổi tên chỉ nếu key mới chưa tồn tại
RENAMENX user:1001 user:profile:1001

Expiration (TTL)

Redis cho phép đặt thời gian sống cho keys. Sau khi hết hạn, key sẽ tự động bị xóa.

Đặt Expiration

# Cách 1: Đặt khi SET
SET session:abc "data" EX 3600    # Hết hạn sau 3600 giây (1 giờ)
SET session:abc "data" PX 3600000  # Hết hạn sau 3600000 ms (1 giờ)
SET session:abc "data" EXAT 1735689600  # Hết hạn tại timestamp cụ thể
SET cache:result "data" EX 300     # Cache 5 phút

# Cách 2: Đặt sau khi tạo
SET otp:123456 "847291"
EXPIRE otp:123456 300              # Hết hạn sau 5 phút

PEXPIRE key 60000                  # Hết hạn sau 60000ms (60 giây)

EXPIREAT key 1735689600            # Hết hạn tại timestamp
PEXPIREAT key 1735689600000        # Hết hạn tại timestamp (ms)

Kiểm tra Expiration

# Xem TTL còn lại (giây)
TTL session:abc
# (integer) 3542  → còn 3542 giây
# (integer) -1    → không có expiration
# (integer) -2    → key không tồn tại

# Xem TTL còn lại (mili giây)
PTTL session:abc
# (integer) 3542000

Xóa Expiration

# Xóa expiration (key sống mãi)
PERSIST session:abc
# (integer) 1 nếu thành công

TTL session:abc
# (integer) -1  → không có expiration

Use Cases thực tế

1. Cache với TTL

# Cache kết quả query trong 10 phút
SET cache:users:active "[{...}]" EX 600

# Cache API response trong 1 phút
SET cache:api:weather:hanoi "{\"temp\": 28}" EX 60

# Cache static content trong 1 giờ
SET cache:config:site "{...}" EX 3600

2. Session Management

# Tạo session, hết hạn sau 24 giờ
HSET session:abc123 user_id "1001" role "admin"
EXPIRE session:abc123 86400

# Gia hạn session khi user hoạt động
EXPIRE session:abc123 86400

# Session tự động bị xóa sau 24 giờ không hoạt động

3. OTP / Verification Code

# Tạo OTP, hết hạn sau 5 phút
SET otp:+84901234567 "847291" EX 300

# Kiểm tra OTP
otp = GET otp:+84901234567
if otp is None:
    print("OTP đã hết hạn")
elif otp == "847291":
    print("Xác thực thành công!")
    DEL otp:+84901234567
else:
    print("OTP sai")

4. Rate Limiting

# Giới hạn 100 request/phút
key = "rate:user:1001"
count = INCR key
if count == 1:
    EXPIRE key 60  # Đặt TTL khi request đầu tiên
if count > 100:
    print("Rate limit exceeded!")

Eviction Policies

Khi Redis hết memory, nó cần xóa bớt keys. maxmemory-policy quyết định xóa keys nào:

Policy Mô tả Use case
noeviction Không xóa, trả lỗi khi hết RAM Dữ liệu quan trọng
allkeys-lru Xóa key ít dùng nhất Cache chung
volatile-lru Xóa key có TTL, ít dùng nhất Cache + persistent data
allkeys-random Xóa ngẫu nhiên Khi mọi key đều equal
volatile-ttl Xóa key sắp hết hạn nhất Ưu tiên giữ key sống lâu
# Cấu hình trong redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru

Best Practices

  1. Đặt prefix rõ rànguser:1001, cache:api:weather
  2. Luôn đặt TTL cho cache — Tránh memory leak
  3. Dùng SCAN thay KEYS — Trong production
  4. Giới hạn maxmemory — Tránh Redis chiếm hết RAM
  5. Chọn eviction policy phù hợp — Tùy use case
Redis key expiration and TTL management
TTL giúp Redis tự động dọn dẹp dữ liệu hết hạn

Bước tiếp theo

Bạn đã nắm vững cách quản lý keys và expiration! Tiếp theo, chúng ta sẽ tìm hiểu về Pub/Sub — cơ chế giao tiếp real-time giữa các services.

👉 Bài tiếp theo: Pub/Sub 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