namespace HealthMonitor.Core.Common { /// <summary> /// 分布式同步锁 /// </summary> public class DistributedLocker : IDisposable { private const string KEY_LOCKER = nameof(DistributedLocker); private const int EXPIRE_SECONDS = 10; private CSRedis.CSRedisClientLock redis_lock; /// <summary> /// 分布式锁(基于Redis) /// </summary> /// <param name="caller"></param> /// <param name="isAutoDelay"></param> /// <exception cref="TimeoutException"></exception> public DistributedLocker(object caller, bool isAutoDelay = false) : this(caller.GetType().FullName, isAutoDelay) { } /// <summary> /// 分布式锁(基于Redis) /// </summary> /// <param name="title"></param> /// <param name="isAutoDelay"></param> /// <exception cref="TimeoutException"></exception> public DistributedLocker(string? title = null, bool isAutoDelay = false) { if (string.IsNullOrWhiteSpace(title)) title = KEY_LOCKER; redis_lock = RedisHelper.Lock(title, EXPIRE_SECONDS, isAutoDelay); if (redis_lock == null) throw new TimeoutException("RedisLock获取超时"); } public void Dispose() { redis_lock?.Unlock(); //RedisHelper.Del(KEY_LOCKER); } } }