using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; namespace OASystem.Infrastructure.Tools { #region MyRegion //**************操作记录****************** //内容描述:Redis帮助类 //*************************************** //public static class RedisHelper //{ // private static string _strConn = "132.232.92.186:6379"; // private static string _strPwd = ""; // private static int _strDb = -1; // static ConnectionMultiplexer _redis; // static readonly object _locker = new object(); // #region 单例模式 // public static ConnectionMultiplexer Manager // { // get // { // if (_redis == null) // { // lock (_locker) // { // if (_redis != null) return _redis; // _redis = GetManager(); // return _redis; // } // } // return _redis; // } // } // private static ConnectionMultiplexer GetManager(string connectionString = null) // { // if (string.IsNullOrEmpty(connectionString)) // { // connectionString = _strConn; // } // var options = ConfigurationOptions.Parse(connectionString); // options.Password = _strPwd; // return ConnectionMultiplexer.Connect(options); // } // #endregion // #region 辅助方法 // /// // /// 对象序列化成字符串 // /// // /// 泛型对象 // /// // /// // private static string ConvertJson(T value) // { // string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value); // return result; // } // /// // /// RedisValue序列化成对象 // /// // /// 序列化后的对象 // /// RedisValue // /// // private static T ConvertObj(RedisValue value) // { // if (value.IsNull) // { // return default(T); // } // else // { // return JsonConvert.DeserializeObject(value); // } // } // /// // /// 多个值序列化成list集合 // /// // /// 集合对象 // /// RedisValue // /// // private static List ConvetList(RedisValue[] values) // { // List result = new List(); // foreach (var item in values) // { // var model = ConvertObj(item); // if (model != null) // result.Add(model); // } // return result; // } // private static RedisKey[] ConvertRedisKeys(List redisKeys, string prefix) // { // if (string.IsNullOrEmpty(prefix)) // { // return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray(); // } // else // { // return redisKeys.Select(redisKey => (RedisKey)(prefix + ":" + redisKey)).ToArray(); // } // } // /// // /// 获取要操作的库 // /// // /// 库,0和-1都是第一个库,1是第二个库... // /// // private static int GetOperationDB(RedisEnum db) // { // if (db == RedisEnum.DB0) // { // return _strDb; // } // else // { // return (int)db; // } // } // /// // /// 获得枚举的Description // /// // /// 枚举值 // /// 当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用 // /// 枚举的Description // private static string GetDescription(this Enum value, Boolean nameInstead = true) // { // Type type = value.GetType(); // string name = Enum.GetName(type, value); // if (name == null) // { // return null; // } // FieldInfo field = type.GetField(name); // DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; // if (attribute == null && nameInstead == true) // { // return name; // } // return attribute == null ? null : attribute.Description; // } // #endregion // /// // /// 是否存在 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // public static bool KeyExists(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // try // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).KeyExists(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // } // catch (Exception) // { // return false; // } // } // /// // /// 设置过期时间 // /// // /// 键 // /// 过期时间,单位:分钟 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // public static bool KeyExpire(string key, int min = 600, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // try // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).KeyExpire(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, DateTime.Now.AddMinutes(min)); // } // catch (Exception) // { // return false; // } // } // /// // /// 修改键 // /// // /// 键 // /// 新键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool KeyRename(string key, string newKey, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // try // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).KeyRename(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, string.IsNullOrEmpty(strFd) ? newKey : strFd + ":" + newKey); // } // catch (Exception) // { // return false; // } // } // /// // /// 清空 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static IEnumerable AllClear(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // return Manager.GetServer(_strConn, _strPwd).Keys(GetOperationDB(db), key); // } // /// // /// 删除 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool KeyDelete(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // try // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).KeyDelete(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // } // catch (Exception) // { // return false; // } // } // /// // /// 批量删除 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static long KeyDelete(List keys, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // try // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).KeyDelete(ConvertRedisKeys(keys, strFd)); // } // catch (Exception) // { // return 0; // } // } // /// // /// 缓存单个字符串 // /// // /// 键 // /// 值 // /// 过期时间,单位:分钟 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool StringSet(string key, string value, int expireMinutes = 600, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).StringSet(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, value, TimeSpan.FromMinutes(expireMinutes)); // } // /// // /// 批量缓存字符串 // /// // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool StringSet(string[] keysStr, string[] valuesStr, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // var vCount = keysStr.Length; // var vKeyValuePair = new KeyValuePair[vCount]; // for (int i = 0; i < vCount; i++) // { // vKeyValuePair[i] = new KeyValuePair(string.IsNullOrEmpty(strFd) ? keysStr[i] : strFd + ":" + keysStr[i], valuesStr[i]); // } // return Manager.GetDatabase(GetOperationDB(db)).StringSet(vKeyValuePair); // } // /// // /// 缓存限时对象 // /// // /// 类型 // /// 键 // /// 值 // /// 过期时间,单位:分钟 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool StringSet(string key, T obj, int expireMinutes = 600, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).StringSet(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, JsonConvert.SerializeObject(obj), TimeSpan.FromMinutes(expireMinutes)); // } // /// // /// 缓存对象 // /// // /// 类型 // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static bool StringSet(string key, T obj, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).StringSet(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, JsonConvert.SerializeObject(obj)); // } // /// // /// 根据key获取值 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static string StringGet(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).StringGet(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // } // /// // /// 批量根据key获取 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static RedisValue[] StringGet(List keys, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).StringGet(ConvertRedisKeys(keys, strFd)); // } // /// // /// 根据key获取单个对象 // /// // /// 类型 // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static T StringGet(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // string vValue = Manager.GetDatabase(GetOperationDB(db)).StringGet(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // return ConvertObj(vValue); // } // /// // /// 入栈(后插入的在List前面) // /// // /// 类型 // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // public static long ListLeftPush(string key, T value, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).ListLeftPush(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, ConvertJson(value)); // } // /// // /// 批量入栈(后插入的在List前面) // /// // /// 类型 // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static long ListLeftPush(string key, List values, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // var vRedisValues = values.Select(m => (RedisValue)ConvertJson(m)).ToArray(); // return Manager.GetDatabase(GetOperationDB(db)).ListLeftPush(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, vRedisValues); // } // /// // /// 出栈(删除最前面的一个元素并返回) // /// // /// 类型 // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static T ListLeftPop(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // var vRedisValues = Manager.GetDatabase(GetOperationDB(db)).ListLeftPop(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // return ConvertObj(vRedisValues); // } // /// // /// 入队(后插入的在List后面) // /// // /// 类型 // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // public static long ListRightPush(string key, T value, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).ListRightPush(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, ConvertJson(value)); // } // /// // /// 批量入队(后插入的在List后面) // /// // /// 类型 // /// 键 // /// 值 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static long ListRightPush(string key, List values, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // var vRedisValues = values.Select(m => (RedisValue)ConvertJson(m)).ToArray(); // return Manager.GetDatabase(GetOperationDB(db)).ListRightPush(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, vRedisValues); // } // /// // /// 获取 // /// 类型 // /// 键 // /// 索引开始 // /// 索引结束 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static List ListRange(string key, long start = 0, long stop = -1, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // var vRedisValues = Manager.GetDatabase(GetOperationDB(db)).ListRange(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key, start, stop); // return ConvetList(vRedisValues); // } // /// // /// 获取个数 // /// // /// 键 // /// 目录,默认根目录 // /// 库,默认读取配置文件 // /// // public static long ListLength(string key, RedisFolderEnum folder = RedisFolderEnum.Root, RedisEnum db = RedisEnum.DB0) // { // string strFd = GetDescription(folder); // return Manager.GetDatabase(GetOperationDB(db)).ListLength(string.IsNullOrEmpty(strFd) ? key : strFd + ":" + key); // } //} #endregion #region MyRegion /// /// Redis帮助类 /// //public class RedisHelper : IDisposable //{ // private static readonly object Locker = new object(); // private static ConnectionMultiplexer redis = null; // private static bool connected = false; // private IDatabase db = null; // private static string _ip; // private static string _port; // private static string _pwd; // public bool IsConnected { get { GetRedisConnect(); return redis.IsConnected; } } // //public RedisHelper(string ip, string port, string pwd = "") // //{ // // _ip = ip; // // _port = port; // // _pwd = pwd; // //} // /// // /// Redis连接 // /// // /// // private int GetRedisConnect() // { // if (connected) // { // return 0; // } // lock (Locker) // { // if (redis == null || !redis.IsConnected) // { // redis = ConnectionMultiplexer.Connect($"{_ip}:{_port},password={_pwd},abortConnect = false"); // } // } // connected = true; // return 0; // } // public void Using(Action action) // { // using (var redisHelper = new RedisHelper(_ip, _port, _pwd)) // { // action(redisHelper); // } // } // public RedisHelper Use(int redisEnum) // { // db = redis.GetDatabase(redisEnum); // //Log.Logs($"RedisDB Conntet State: {redis.IsConnected}"); // var t = db.Ping(); // //Log.Logs($"RedisDB Select {i}, Ping.{t.TotalMilliseconds}ms"); // return this; // } // public void Close(bool allowCommandsToComplete = true) // { // if (redis != null) // { // redis.Close(allowCommandsToComplete); // } // } // public void CloseAsync(bool allowCommandsToComplete = true) // { // if (redis != null) // { // redis.CloseAsync(allowCommandsToComplete); // } // } // public void Dispose() // { // db = null; // } // #region 发布订阅 // public delegate void RedisDeletegate(string str); // public event RedisDeletegate RedisSubMessageEvent; // /// // /// 发布消息 // /// // /// // /// // /// // public long RedisPublish(string channel, string msg) // { // ISubscriber sub = redis.GetSubscriber(); // return sub.Publish(channel, msg); // } // /// // /// 订阅消息 // /// // /// // /// // public void RedisSubScribe(string subChannael) // { // ISubscriber sub = redis.GetSubscriber(); // sub.Subscribe(subChannael, (channel, message) => // { // RedisSubMessageEvent?.Invoke(message); //触发事件 // }); // } // /// // /// 取消订阅 // /// // /// // public void Unsubscribe(string channel) // { // ISubscriber sub = redis.GetSubscriber(); // sub.Unsubscribe(channel); // } // /// // /// 取消全部订阅 // /// // public void UnsubscribeAll() // { // ISubscriber sub = redis.GetSubscriber(); // sub.UnsubscribeAll(); // } // #endregion // #region String类型操作 // /// // /// 设置指定key 的值(默认第0个库) // /// // /// 指定key的值 // /// // /// // public bool InsertStr(string strKey, string strValue) // { // var db = redis.GetDatabase(); // return db.StringSet(strKey, strValue); // } // /// // /// 设置指定key 的值(指定库) // /// // /// // /// // /// // /// // public bool InsertStr(string strKey, string strValue, int database) // { // var db = redis.GetDatabase(database); // return db.StringSet(strKey, strValue); // } // /// // /// 设置指定key 的值(指定第一个库,指定过期时间) // /// // /// 指定key的值 // /// // /// // public bool InsertStrExpire(string strKey, string strValue, DateTime expire) // { // var db = redis.GetDatabase(1); // db.StringSet(strKey, strValue); // return db.KeyExpire(strKey, expire); // } // /// // /// 设置指定key 的值(指定第一个库,指定过期分钟数) // /// // /// 指定key的值 // /// // /// // public bool InsertStrExpire(string strKey, string strValue, int timespanmin) // { // var db = redis.GetDatabase(1); // return db.StringSet(strKey, strValue, TimeSpan.FromMinutes(timespanmin)); // } // /// // /// 设置指定key 的值(指定第一个库,指定过期分钟数) // /// // /// 指定key的值 // /// // /// // public void InsertStrExpireByDatabaseOne(string strKey, string strValue, int timespanmin) // { // var db = redis.GetDatabase(1); // db.StringSet(strKey, strValue, TimeSpan.FromMinutes(timespanmin)); // } // /// // /// 获取指定 key 的值(默认第0个库) // /// // /// 指定key的值 // /// // public string ReadStr(string strKey) // { // var db = redis.GetDatabase(); // return db.StringGet(strKey); // } // /// // /// 获取指定 key 的值(指定第一个库) // /// // /// 指定key的值 // /// // public string ReadStrByDatabaseOne(string strKey) // { // var db = redis.GetDatabase(1); // return db.StringGet(strKey); // } // /// // /// 获取指定 key 的值(指定第一个库) // /// // /// 指定key的值 // /// // /// // public string ReadStrByDatabase(string strKey, int database) // { // var db = redis.GetDatabase(database); // return db.StringGet(strKey); // } // /// // /// 删除指定key的值(默认第0个库) // /// // /// 指定key的值 // public bool DeleteStr(string strKey) // { // var db = redis.GetDatabase(); // return db.KeyDelete(strKey); // } // /// // /// 删除指定key的值(默认第0个库) // /// // /// 指定key的值 // /// 指定库的值 // public bool DeleteStrByDatabase(string strKey, int database) // { // var db = redis.GetDatabase(database); // return db.KeyDelete(strKey); // } // public bool Exist(string strKey) // { // var db = redis.GetDatabase(); // return db.KeyExists(strKey); // } // #endregion // #region Hash类型操作 // public bool InsertHash(string tablename, string strKey, string strValue) // { // var db = redis.GetDatabase(); // return db.HashSet(tablename, strKey, strValue); // } // public string ReadHash(string tablename, string strKey) // { // var db = redis.GetDatabase(); // return db.HashGet(tablename, strKey); // } // public bool ExistHash(string tablename, string strKey) // { // var db = redis.GetDatabase(); // return db.HashExists(tablename, strKey); // } // public bool DeleteHash(string tablename, string strKey) // { // var db = redis.GetDatabase(); // return db.HashDelete(tablename, strKey); // } // #endregion //} #endregion public class RedisHelper : IDisposable { //连接字符串 private string _connectionString; //实例名称 private string _instanceName; //默认数据库 private int _defaultDB; private ConcurrentDictionary _connections; public RedisHelper(string connectionString, string instanceName, int defaultDB = 0) { _connectionString = connectionString; _instanceName = instanceName; _defaultDB = defaultDB; _connections = new ConcurrentDictionary(); } /// /// 获取ConnectionMultiplexer /// /// private ConnectionMultiplexer GetConnect() { return _connections.GetOrAdd(_instanceName, p => ConnectionMultiplexer.Connect(_connectionString)); } /// /// 获取数据库 /// /// /// 默认为0:优先代码的db配置,其次config中的配置 /// public IDatabase GetDatabase(RedisEnum redisEnum) { return GetConnect().GetDatabase((int)redisEnum); } public IServer GetServer(string configName = null, int endPointsIndex = 0) { var confOption = ConfigurationOptions.Parse(_connectionString); return GetConnect().GetServer(confOption.EndPoints[endPointsIndex]); } public ISubscriber GetSubscriber(string configName = null) { return GetConnect().GetSubscriber(); } public void Dispose() { if (_connections != null && _connections.Count > 0) { foreach (var item in _connections.Values) { item.Close(); } } } } }