Redis và những điều chưa biết
Các kiểu dữ liệu trong Redis
1. String
Nó có thể lưu trữ văn bản, số nguyên, hoặc số thực.
Đặc điểm:
- 512MB
- Lưu thông tin người dùng, bộ đếm, token
RedisTemplate<String, String> redisTemplate;
redisTemplate.opsForValue().set(key, value);
redisTemplate.opsForValue().get(key);
SET user:1:name "Alice" # Lưu tên người dùng
SET user:1:age 30 # Lưu tuổi người dùng
INCR user:1:age # Tăng tuổi lên 1
GET user:1:age # Kết quả: 31
2. Hash
Hash lưu trữ các cặp field-value, tương tự như một đối tượng hoặc bản ghi trong cơ sở dữ liệu.
Đặc điểm:
- Lưu thông tin nhóm
- 1 Hash chứa tối đa 2^32 field
RedisTemplate<String, Object> redisTemplate;
public void saveHash(String key, Map<String, Object> data) {
redisTemplate.opsForHash().putAll(key, data);
}
public Map<Object, Object> getHash(String key) {
return redisTemplate.opsForHash().entries(key);
}
public Object getHashField(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
HSET user:2 name "Bob" age 25 email "bob@example.com" # Lưu thông tin người dùng
HGET user:2 name # Kết quả: "Bob"
HGETALL user:2 # Kết quả: tất cả thông tin
HDEL user:2 email # Xóa email khỏi hash
3. List
List là một danh sách các giá trị được sắp xếp theo thứ tự (FIFO hoặc LIFO).
Ứng dụng: Quản lý công việc theo hàng đợi, xử lý yêu cầu tuần tự.
Đặc điểm:
- Có thể sử dụng stack or queue
- 2^32 phần tử
RedisTemplate<String, String> redisTemplate;
redisTemplate.opsForList().leftPush(key, value);
public List<String> getList(String key) {
return redisTemplate.opsForList().range(key, 0, -1);
}
LPUSH tasks "task1" "task2" # Thêm vào đầu danh sách
RPUSH tasks "task3" # Thêm vào cuối danh sách
LRANGE tasks 0 -1 # Lấy tất cả phần tử (Kết quả: task2, task1, task3)
LPOP tasks # Lấy và xóa phần tử đầu tiên (task2)
4. Set
Set là một tập hợp các giá trị duy nhất, không có thứ tự.
Ứng dụng: Lưu trữ danh sách tag, người theo dõi (followers), hoặc quyền truy cập.
Đặc điểm:
- Lưu dữ liệu không trùng nhau
- Hỗ trợ các thao tác toán học trên tập hợp (union, intersection, difference).
RedisTemplate<String, String> redisTemplate;
redisTemplate.opsForSet().add(key, value);
public Set<String> getSet(String key) {
return redisTemplate.opsForSet().members(key);
}
SADD tags "redis" "database" "nosql" # Thêm các tag
SMEMBERS tags # Lấy tất cả phần tử
SREM tags "nosql" # Xóa phần tử "nosql"
Thời gian sống của key trong Redis
TTL - Time To Live Có các tính năng:
- Set thời gian sống cho key
- Đặt thời gian sống với mốc thời gian
- Kiểm tra thời gian sống
- Loại bỏ TTL khỏi key
Thông thường ta chỉ set thời gian sống cho key. Nhưng trong dự án tôi đã tìm hiểu được thêm cách có thể set thời gian cho từng field trong dữ liệu Hash.
Đó là sử dụng RMapCache của Redission
RMapCache<String, String> cacheMap = redissonClient.getMapCache("user:1001");
cacheMap.put("name", "Alice", 60, TimeUnit.SECONDS);
cacheMap.put("age", "30", 120, TimeUnit.SECONDS);
Khi các field hết thời gian thì key cũng bị xóa.
- Redis gốc không hỗ trợ TTL riêng cho từng field trong Hash.
- Với RedisTemplate, bạn có thể:
- Lưu từng field dưới dạng key riêng (đơn giản nhất).
- Sử dụng Sorted Set để quản lý TTL, kết hợp với logic tùy chỉnh.
- Nếu dự án yêu cầu TTL cho từng field mà không muốn triển khai logic phức tạp, nên cân nhắc dùng Redisson với RMapCache.
Redis có giống Kafka không?
Yếu tố | Redis Pub/Sub | Kafka |
---|---|---|
Yêu cầu lưu trữ lịch sử tin nhắn | Không cần | Cần lưu trữ để phân tích hoặc tái xử lý |
Độ trễ | Thấp (real-time) | Thấp, nhưng cao hơn Redis do ghi vào đĩa |
Quy mô | Quy mô nhỏ, đơn giản | Quy mô lớn, phức tạp |
Độ tin cậy | Không đảm bảo độ tin cậy | Đảm bảo độ tin cậy (tin nhắn không mất) |
Sử dụng tài nguyên | RAM | RAM + Disk |
Khả năng mở rộng | Hạn chế | Mở rộng tốt |
Triển khai Redis
RedissonClient - Client Redis Standalone
Redis Cluster:
Redis Cluster là lựa chọn tốt khi bạn cần:
- Chia sẻ dữ liệu trên nhiều node.
- Mở rộng quy mô theo chiều ngang.
All rights reserved