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 object redisLock = new object();
///
/// 设置默认链接
///
///
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);
}
}
}
}