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();
}
}
}
}
}