Redis được sử dụng để quản lý phiên đăng nhập (ví dụ: hết hạn sau 20 phút) và giải quyết vấn đề tranh chấp tài nguyên trong các hệ thống phân tán như e-commerce. Redis hoạt động hiệu quả nhờ cơ chế đơn luồng I/O đa kênh.
Xử lý tranh chấp tài nguyên
Trong môi trường đa luồng, việc truy cập đồng thời vào tài nguyên dùng chung có thể gây ra xung đột dữ liệu. Các giải pháp khóa bao gồm:- Khóa bi quan (Blocking Lock): Chặn luồng cho tới khi tài nguyên khả dụng
- Khóa lạc quan (Non-blocking Lock): Thử truy cập và xử lý lỗi nếu thất bại
Triển khai trên Redis
1. Ứng dụng đơn thể
public class InventoryManager {
public static int Stock = 5;
private static readonly object SyncLock = new object();
public static void ProcessOrder() {
lock (SyncLock) {
if (Stock > 0) {
Stock--;
Console.WriteLine($"Order processed. Remaining: {Stock}");
}
}
}
}
2. Khóa bi quan với Redis
public class RedisPessimisticLock {
public static void SecureOrder(string key, TimeSpan expiry) {
using var redis = new RedisClient("redis-server", 6379);
using (redis.AcquireLock(key, expiry)) {
int stock = redis.Get<int>("stock");
if (stock > 0) {
redis.Set("stock", stock - 1);
}
}
}
}
3. Khóa lạc quan với Redis
public class RedisOptimisticLock {
public static void TryProcessOrder(string key, TimeSpan expiry) {
using var redis = new RedisClient("redis-server", 6379);
bool acquired = redis.Add("lock:" + key, key, expiry);
if (acquired) {
try {
int stock = redis.Get<int>("stock");
if (stock > 0) redis.Set("stock", stock - 1);
}
finally {
redis.Remove("lock:" + key);
}
}
}
}
4. Cluster Redis với Redlock
public class RedisClusterLock {
public static void ProcessWithRedLock(string key, TimeSpan timeout) {
var endpoints = new[] {
"192.168.1.1:6380",
"192.168.1.1:6381",
"192.168.1.1:6382"
};
var redLock = new RedLockManager(endpoints.Select(e =>
ConnectionMultiplexer.Connect(e)));
if (redLock.AcquireLock(key, timeout, out var lockObj)) {
try {
using var redis = new RedisClient("redis-server", 6379);
int stock = redis.Get<int>("stock");
if (stock > 0) redis.Set("stock", stock - 1);
}
finally {
redLock.ReleaseLock(lockObj);
}
}
}
}
Kiến trúc Redlock
- Yêu cầu đa số node Redis xác nhận khóa
- Tự động hủy khóa khi hết hạn
- Bù trừ độ trễ mạng với Clock Drift Factor