zoukankan      html  css  js  c++  java
  • C#Redis缓存帮助类

    工厂创建类:

    public class CacheFactory
        {
            private static ICache cache = null;
    
            private static readonly object lockHelper = new object();
    
            public static ICache Cache
            {
                get
                {
                    if (cache == null)
                    {
                        lock (lockHelper)
                        {
                            if (cache == null)
                            {
                                switch (CacheProvider)
                                {
                                    case "Redis":cache = new RedisCacheImp(); break;
                                    default:
                                    case "Memory":cache = new MemoryCacheImp();break;
                                }
                            }
                        }
                    }
                    return cache;
                }
            }
    
            public static string CacheProvider { get; set; } = "Redis";
        }
    

      接口:

    public interface ICache
        {
            bool SetCache<T>(string key, T value, DateTime? expireTime = null);
    
            T GetCache<T>(string key);
    
            bool RemoveCache(string key);
    
            #region Hash
            int SetHashFieldCache<T>(string key, string fieldKey, T fieldValue);
    
            int SetHashFieldCache<T>(string key, Dictionary<string, T> dict);
    
            T GetHashFieldCache<T>(string key, string fieldKey);
    
            Dictionary<string, T> GetHashFieldCache<T>(string key, Dictionary<string, T> dict);
    
            Dictionary<string, T> GetHashCache<T>(string key);
    
            List<T> GetHashToListCache<T>(string key);
    
            bool RemoveHashFieldCache(string key, string fieldKey);
    
            Dictionary<string, bool> RemoveHashFieldCache(string key, Dictionary<string, bool> dict);
            #endregion
        }
    

      RedisCacheImp

     public class RedisCacheImp : ICache
        {
            private IDatabase cache;
            private ConnectionMultiplexer connection;
    
            public RedisCacheImp()
            {
                connection = ConnectionMultiplexer.Connect(RedisConnectionString);
                cache = connection.GetDatabase();
            }
    
    
            public bool SetCache<T>(string key, T value, DateTime? expireTime = null)
            {
                try
                {
                    var jsonOption = new JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                    };
                    string strValue = JsonConvert.SerializeObject(value, jsonOption);
                    if (string.IsNullOrEmpty(strValue)) return false;
                    
                    if (expireTime == null) return cache.StringSet(key, strValue);
                    else return cache.StringSet(key, strValue, (expireTime.Value - DateTime.Now));
                    
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                }
                return false;
            }
    
            public bool RemoveCache(string key)
            {
                return cache.KeyDelete(key);
            }
    
            public T GetCache<T>(string key)
            {
                var t = default(T);
                try
                {
                    var value = cache.StringGet(key);
                    if (string.IsNullOrEmpty(value))
                    {
                        return t;
                    }
                    t = JsonConvert.DeserializeObject<T>(value);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                }
                return t;
            }
    
            #region Hash
            public int SetHashFieldCache<T>(string key, string fieldKey, T fieldValue)
            {
                return SetHashFieldCache<T>(key, new Dictionary<string, T> { { fieldKey, fieldValue } });
            }
    
            public int SetHashFieldCache<T>(string key, Dictionary<string, T> dict)
            {
                int count = 0;
                var jsonOption = new JsonSerializerSettings()
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                };
                foreach (string fieldKey in dict.Keys)
                {
                    string fieldValue = JsonConvert.SerializeObject(dict[fieldKey], jsonOption);
                    count += cache.HashSet(key, fieldKey, fieldValue) ? 1 : 0;
                }
                return count;
            }
    
            public T GetHashFieldCache<T>(string key, string fieldKey)
            {
                var dict = GetHashFieldCache<T>(key, new Dictionary<string, T> { { fieldKey, default(T) } });
                return dict[fieldKey];
            }
    
            public Dictionary<string, T> GetHashFieldCache<T>(string key, Dictionary<string, T> dict)
            {
                foreach (string fieldKey in dict.Keys)
                {
                    string fieldValue = cache.HashGet(key, fieldKey);
                    dict[fieldKey] = JsonConvert.DeserializeObject<T>(fieldValue);
                }
                return dict;
            }
    
            public Dictionary<string, T> GetHashCache<T>(string key)
            {
                Dictionary<string, T> dict = new Dictionary<string, T>();
                var hashFields = cache.HashGetAll(key);
                foreach (HashEntry field in hashFields)
                {
                    dict[field.Name] = JsonConvert.DeserializeObject<T>(field.Value);
                }
                return dict;
            }
    
            public List<T> GetHashToListCache<T>(string key)
            {
                List<T> list = new List<T>();
                var hashFields = cache.HashGetAll(key);
                foreach (HashEntry field in hashFields)
                {
                    list.Add(JsonConvert.DeserializeObject<T>(field.Value));
                }
                return list;
            }
    
            public bool RemoveHashFieldCache(string key, string fieldKey)
            {
                Dictionary<string, bool> dict = new Dictionary<string, bool> { { fieldKey, false } };
                dict = RemoveHashFieldCache(key, dict);
                return dict[fieldKey];
            }
    
            public Dictionary<string, bool> RemoveHashFieldCache(string key, Dictionary<string, bool> dict)
            {
                foreach (string fieldKey in dict.Keys)
                {
                    dict[fieldKey] = cache.HashDelete(key, fieldKey);
                }
                return dict;
            }
            #endregion
    
            public void Dispose()
            {
                if (connection != null)
                {
                    connection.Close();
                }
                GC.SuppressFinalize(this);
            }
            public string RedisConnectionString { get; set; }
        }
    

      MemoryCacheImp

    public class MemoryCacheImp : ICache
        {
            public static IServiceProvider ServiceProvider { get; set; }
            private IMemoryCache cache = ServiceProvider.GetService<IMemoryCache>();
    
            public bool SetCache<T>(string key, T value, DateTime? expireTime = null)
            {
                try
                {
                    if (expireTime == null) return cache.Set<T>(key, value) != null;
                    return cache.Set(key, value, (expireTime.Value - DateTime.Now)) != null;
                }
                catch (Exception ex)
                {
                    LogHelper.Error(ex);
                }
                return false;
            }
    
            public bool RemoveCache(string key)
            {
                cache.Remove(key);
                return true;
            }
    
            public T GetCache<T>(string key)
            {
                var value = cache.Get<T>(key);
                return value;
            }
    
            #region Hash
            public int SetHashFieldCache<T>(string key, string fieldKey, T fieldValue)
            {
                return SetHashFieldCache<T>(key, new Dictionary<string, T> { { fieldKey, fieldValue } });
            }
    
            public int SetHashFieldCache<T>(string key, Dictionary<string, T> dict)
            {
                int count = 0;
                foreach (string fieldKey in dict.Keys)
                {
                    count += cache.Set(key, dict) != null ? 1 : 0;
                }
                return count;
            }
            public T GetHashFieldCache<T>(string key, string fieldKey)
            {
                var dict = GetHashFieldCache<T>(key, new Dictionary<string, T> { { fieldKey, default(T) } });
                return dict[fieldKey];
            }
            public Dictionary<string, T> GetHashFieldCache<T>(string key, Dictionary<string, T> dict)
            {
                var hashFields = cache.Get<Dictionary<string, T>>(key);
                foreach (KeyValuePair<string, T> keyValuePair in hashFields.Where(p => dict.Keys.Contains(p.Key)))
                {
                    dict[keyValuePair.Key] = keyValuePair.Value;
                }
                return dict;
            }
    
            public Dictionary<string, T> GetHashCache<T>(string key)
            {
                Dictionary<string, T> dict = new Dictionary<string, T>();
                var hashFields = cache.Get<Dictionary<string, T>>(key);
                foreach (string field in hashFields.Keys)
                {
                    dict[field] = hashFields[field];
                }
                return dict;
            }
    
            public List<T> GetHashToListCache<T>(string key)
            {
                List<T> list = new List<T>();
                var hashFields = cache.Get<Dictionary<string, T>>(key);
                foreach (string field in hashFields.Keys)
                {
                    list.Add(hashFields[field]);
                }
                return list;
            }
    
            public bool RemoveHashFieldCache(string key, string fieldKey)
            {
                Dictionary<string, bool> dict = new Dictionary<string, bool> { { fieldKey, false } };
                dict = RemoveHashFieldCache(key, dict);
                return dict[fieldKey];
            }
    
            public Dictionary<string, bool> RemoveHashFieldCache(string key, Dictionary<string, bool> dict)
            {
                var hashFields = cache.Get<Dictionary<string, object>>(key);
                foreach (string fieldKey in dict.Keys)
                {
                    dict[fieldKey] = hashFields.Remove(fieldKey);
                }
                return dict;
            }
            #endregion
        }
    

      日志记录:

     public class LogHelper
        {
            private static readonly Logger log = LogManager.GetLogger(string.Empty);
    
            public static void Trace(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Trace(msg.ParseToString());
                }
                else
                {
                    log.Trace(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Debug(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Debug(msg.ParseToString());
                }
                else
                {
                    log.Debug(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Info(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Info(msg.ParseToString());
                }
                else
                {
                    log.Info(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Warn(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Warn(msg.ParseToString());
                }
                else
                {
                    log.Warn(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Error(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Error(msg.ParseToString());
                }
                else
                {
                    log.Error(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Error(Exception ex)
            {
                if (ex != null)
                {
                    log.Error(GetExceptionMessage(ex));
                }
            }
    
            public static void Fatal(object msg, Exception ex = null)
            {
                if (ex == null)
                {
                    log.Fatal(msg.ParseToString());
                }
                else
                {
                    log.Fatal(msg + GetExceptionMessage(ex));
                }
            }
    
            public static void Fatal(Exception ex)
            {
                if (ex != null)
                {
                    log.Fatal(GetExceptionMessage(ex));
                }
            }
    
            private static string GetExceptionMessage(Exception ex)
            {
                string message = string.Empty;
                if (ex != null)
                {
                    message += ex.Message;
                    message += Environment.NewLine;
                    Exception originalException = ex.GetOriginalException();
                    if (originalException != null)
                    {
                        if (originalException.Message != ex.Message)
                        {
                            message += originalException.Message;
                            message += Environment.NewLine;
                        }
                    }
                    message += ex.StackTrace;
                    message += Environment.NewLine;
                }
                return message;
            }
        }
        public static partial class Extensions
        {
            public static Exception GetOriginalException(this Exception ex)
            {
                if (ex.InnerException == null) return ex;
    
                return ex.InnerException.GetOriginalException();
            }
    
            public static string ParseToString(this object obj)
            {
                try
                {
                    if (obj == null)
                        return string.Empty;
                    else
                        return obj.ToString();
                }
                catch 
                {
                    return string.Empty;
                }
            }
        }
    

      

  • 相关阅读:
    20120410日常记录
    20120229
    20120307
    20120411记录
    javaScript OOP学习总结
    vue.js初学习
    SQL Server 2008 r2 新建实例无法远程访问 Error:40
    SSRS 中表格报表分组字段含有NULL
    Iframe中的SSRS报表中使用windows.open在新窗口中不能打开URL中的问题
    SSIS中的Unicode,非Unicode问题
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/13552920.html
Copyright © 2011-2022 走看看