Tích hợp Redis cho Quản lý Phiên và Khóa Phân tán trong .NET Core

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

Thẻ: Redis .net core Distributed Locking Session Management Redlock

Đăng vào ngày 8 tháng 6 lúc 02:51