using FreeRedis; using ServiceCenter.Logs; namespace ServiceCenter.Redis { /// /// Redis /// public class RedisHub { /// /// 连接集合 /// private static List RedisClients = new List(); /// /// 默认上下文类类型 /// public static string DefaultContextType { get; private set; } = null!; /// /// 默认监控上下文类类型 /// public static string MonitorContextType { get; private set; } = null!; /// /// 默认调试上下文类类型 /// public static string DebugContextType { get; private set; } = null!; /// /// 默认WMS上下文类类型 /// public static string WMSContextType { get; private set; } = null!; /// /// 设置默认链接 /// /// public static void SetDefaultContextType(string key) { DefaultContextType = key; } /// /// 设置监控链接 /// /// public static void SetMonitorContextType(string key) { MonitorContextType = key; } /// /// 设置调试链接 /// /// public static void SetDebugContextType(string key) { DebugContextType = key; } /// /// 设置WMS链接 /// /// public static void SetWMSContextType(string key) { WMSContextType = key; } /// /// 默认链接 /// public static RedisClient Default { get { { if (DefaultContextType == null) throw new Exception("请先设置默认RedisDB库,调用静态方法SetDefaultDbContextType()"); return Context(DefaultContextType); } } } /// /// 监控连接 /// public static RedisClient Monitor { get { { if (MonitorContextType == null) throw new Exception("请先设置监控RedisDB库,调用静态方法SetMonitorContextType()"); return Context(MonitorContextType); } } } /// ///调试连接 /// public static RedisClient Debug { get { { if (MonitorContextType == null) throw new Exception("请先设置DebugRedisDB库,调用静态方法SetDebugContextType()"); return Context(MonitorContextType); } } } /// ///调试连接 /// public static RedisClient WMS { get { { if (WMSContextType == null) throw new Exception("请先设置WMSRedisDB库,调用静态方法SetWMSContextTypee()"); return Context(WMSContextType); } } } /// /// 创建一个连接 /// /// 连接字符串 /// 标识 /// 是否为默认连接,默认为false /// public static RedisClient CreateContext(string connectionString, string key, bool defaultClient = false) { var ctx = RedisClients.FirstOrDefault(v => v.Key == key); if (ctx != null) return ctx.Client; ctx = new RedisClientList(key, new RedisClient(connectionString), connectionString); RedisClients.Add(ctx); if (defaultClient) { SetDefaultContextType(key); } return ctx.Client; } /// /// 获取指定的连接 /// /// /// /// public static RedisClient Context(string key) { var ctx = RedisClients.FirstOrDefault(v => v.Key == key); if (ctx == null) throw new Exception("没有对应的链接,请先调用创建"); return ctx.Client; } /// /// 执行并发锁 /// 使用默认连接 /// /// 并发锁key /// 执行内容 /// public static void Do(string lockKey, Action act) => Do(DefaultContextType, lockKey, act); /// /// 执行并发锁 /// 指定redis /// /// 连接key /// 并发锁key /// 执行内容 /// public static void Do(string key, string lockKey, Action act) { if (!RedisClients.Any()) throw new Exception($"请调用{nameof(CreateContext)}方法设置设置数据库连接"); var redis = Context(key); lockKey = "ConcurrentLock:" + lockKey; try { if (redis.Exists(lockKey)) throw new Exception($"重复调用:{lockKey}"); redis.Set(lockKey, lockKey); redis.Expire(lockKey, 60); act(redis); } catch (Exception ex) { throw new KnownException($"{ex.Message}", LogLevelEnum.Mid); } finally { redis.Del(lockKey); } } } }