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
MULTIvàEXEC. - 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.