Sử dụng Redis và thao tác với Redis trong Python

Redis là hệ thống lưu trữ key-value mã nguồn mở, tuân theo giấy phép BSD, được thiết kế để đạt hiệu suất cao nhờ hoạt động chủ yếu trên bộ nhớ RAM. Dữ liệu trong Redis có thể được lưu trữ bền vững (persistent) xuống đĩa và khôi phục khi khởi động lại.

Tính năng nổi bật của Redis

  • Hỗ trợ nhiều kiểu dữ liệu: String, Hash, List, Set và Sorted Set.
  • Tốc độ truy cập cực nhanh — lên tới hơn 100.000 thao tác đọc/giây và ~80.000 thao tác ghi/giây.
  • Tất cả thao tác đều mang tính nguyên tử (atomic), hỗ trợ giao dịch qua các lệnh MULTIEXEC.
  • Cung cấp cơ chế publish/subscribe, thiết lập thời gian sống (TTL) cho key, sao lưu dữ liệu, v.v.

Cấu hình Redis

Có thể xem hoặc chỉnh sửa cấu hình thông qua CLI:

# Lấy toàn bộ cấu hình
CONFIG GET *

# Lấy một giá trị cụ thể
CONFIG GET loglevel

# Thiết lập giá trị mới
CONFIG SET loglevel "notice"

Các kiểu dữ liệu chính

  • String: Lưu chuỗi, số, hoặc dữ liệu nhị phân (tối đa 512 MB/key).
  • Hash: Cấu trúc ánh xạ key-value lồng nhau, phù hợp để biểu diễn đối tượng.
  • List: Danh sách chuỗi được sắp xếp theo thứ tự chèn, hỗ trợ thao tác ở cả hai đầu (gần giống deque).
  • Set: Tập hợp không chứa phần tử trùng lặp, triển khai bằng bảng băm → O(1) cho thêm/xóa/tìm kiếm.
  • Sorted Set (ZSet): Tương tự Set nhưng mỗi phần tử gắn với điểm số (score) để sắp xếp.

Kết nối và sử dụng Redis trong Python

Cài đặt thư viện:

pip install redis

Ví dụ kết nối cơ bản:

import redis

client = redis.Redis(host="localhost", port=6379, decode_responses=True)
client.set("user_age", 25)
print(type(client.get("user_age")))  # <class 'str'>

Tham số decode_responses=True đảm bảo giá trị trả về là chuỗi (str) thay vì bytes.

Sử dụng Connection Pool

Để tái sử dụng kết nối và giảm chi phí khởi tạo, nên dùng connection pool:

pool = redis.ConnectionPool(host="localhost", port=6379, decode_responses=True)
client = redis.Redis(connection_pool=pool)
client.set("status", "active")
print(client.get("status"))

Một số lệnh phổ biến qua Python

Thao tác với String

client.set("key", "value", ex=60)        # Hết hạn sau 60 giây
value = client.get("key")

client.mset({"name": "Alice", "role": "admin"})
values = client.mget("name", "role")

Thao tác với Hash

client.hset("user:1000", mapping={"name": "Bob", "email": "bob@example.com"})
full_data = client.hgetall("user:1000")
name = client.hget("user:1000", "name")
exists = client.hexists("user:1000", "email")

Thao tác với List

client.lpush("tasks", "task1", "task2")
length = client.llen("tasks")
items = client.lrange("tasks", 0, -1)

# Chèn phần tử trước giá trị "task2"
client.linsert("tasks", "BEFORE", "task2", "priority_task")

# Xóa 1 lần xuất hiện đầu tiên của "task1"
client.lrem("tasks", 1, "task1")

Mô hình Publish/Subscribe

Redis hỗ trợ cơ chế phát-thu tin nhắn theo kênh (channel).

Bên nhận (subscriber):

import redis

r = redis.Redis(decode_responses=True)
pubsub = r.pubsub()
pubsub.subscribe("news_channel")

for message in pubsub.listen():
    if message["type"] == "message":
        print("Nhận được:", message["data"])

Bên gửi (publisher):

import redis

r = redis.Redis()
r.publish("news_channel", "Có tin mới!")

Tích hợp Redis vào Django

Dùng gói django-redis để cấu hình cache backend hoặc session backend:

pip install django-redis

Chi tiết cách cấu hình tham khảo tài liệu chính thức của django-redis.

Thẻ: Redis python django-redis key-value-store pubsub

Đăng vào ngày 24 tháng 6 lúc 17:15