zoukankan      html  css  js  c++  java
  • RedisHelper (C#)

      <add key="RedisServers" value="172.20.2.90:9379,password=Aa+123456789" />
    using StackExchange.Redis;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace APP.Common
    {
        /// <summary>
        /// StackExchangeRedis帮助类
        /// </summary>
        public sealed class RedisHelper
        {
            /// <summary>
            /// Redis服务器地址
            /// </summary>
            private static readonly string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["RedisServers"];
    
            /// <summary>
            /// 静态变量锁
            /// </summary>
            private static object _locker = new Object();
    
            /// <summary>
            /// 静态实例
            /// </summary>
            private static ConnectionMultiplexer _instance = null;
    
            /// <summary>
            /// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
            /// </summary>
            private static ConnectionMultiplexer Instance
            {
                get
                {
                    try
                    {
                        if (_instance == null)
                        {
                            lock (_locker)
                            {
                                if (_instance == null || !_instance.IsConnected)
                                {
                                    _instance = ConnectionMultiplexer.Connect(ConnectionString);
                                    //注册如下事件
                                    _instance.ConnectionFailed += MuxerConnectionFailed;
                                    _instance.ConnectionRestored += MuxerConnectionRestored;
                                    _instance.ErrorMessage += MuxerErrorMessage;
                                    _instance.ConfigurationChanged += MuxerConfigurationChanged;
                                    _instance.HashSlotMoved += MuxerHashSlotMoved;
                                    _instance.InternalError += MuxerInternalError;
                                }
                            }
                        }
    
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Error(typeof(RedisHelper), string.Format("redis初始化异常,连接字符串={0}", ConnectionString), ex);
                    }
                    return _instance;
                }
            }
    
            /// <summary>
            /// 获取redis数据库对象
            /// </summary>
            /// <returns></returns>
            private static IDatabase GetDatabase()
            {
                return Instance.GetDatabase();
            }
    
            /// <summary>
            /// 检查Key是否存在
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static bool Exists(string key)
            {
                if (string.IsNullOrWhiteSpace(key))
                {
                    return false;
                }
                try
                {
                    return GetDatabase().KeyExists(key);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("检查Key是否存在异常,缓存key={0}", key), ex);
                }
                return false;
            }
    
            /// <summary>
            /// 设置String类型的缓存对象(如果value是null或者空字符串则设置失败)
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="ts">过期时间</param>
            public static bool SetString(string key, string value, TimeSpan? ts = null)
            {
                if (string.IsNullOrWhiteSpace(value))
                {
                    return false;
                }
                try
                {
                    return GetDatabase().StringSet(key, value, ts);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("设置string类型缓存异常,缓存key={0},缓存值={1}", key, value), ex);
                }
                return false;
            }
    
            /// <summary>
            /// 根据key获取String类型的缓存对象
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static string GetString(string key)
            {
                try
                {
                    return GetDatabase().StringGet(key);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("获取string类型缓存异常,缓存key={0}", key), ex);
                }
                return null;
            }
    
            /// <summary>
            /// 删除缓存
            /// </summary>
            /// <param name="key">key</param>
            /// <returns></returns>
            public static bool KeyDelete(string key)
            {
                try
                {
                    return GetDatabase().KeyDelete(key);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), "删除缓存异常,缓存key={0}" + key, ex);
                    return false;
                }
            }
            /// <summary>
            /// 设置Hash类型缓存对象(如果value没有公共属性则不设置缓存)
            ///    会使用反射将object对象所有公共属性作为Hash列存储
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public static void SetHash(string key, object value)
            {
                if (null == value)
                {
                    return;
                }
                try
                {
                    List<HashEntry> list = new List<HashEntry>();
                    Type type = value.GetType();
                    var propertyArray = type.GetProperties();
                    foreach (var property in propertyArray)
                    {
                        string propertyName = property.Name;
                        string propertyValue = property.GetValue(value).ToString();
                        list.Add(new HashEntry(propertyName, propertyValue));
                    }
                    if (list.Count < 1)
                    {
                        return;
                    }
                    IDatabase db = GetDatabase();
                    db.HashSet(key, list.ToArray());
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("设置Hash类型缓存异常,缓存key={0},缓存值={1}", key, Utils.SerializeObject(value)), ex);
                }
            }
    
            /// <summary>
            /// 设置Hash类型缓存对象(用于存储对象)
            /// </summary>
            /// <param name="key">Key</param>
            /// <param name="value">字典,key是列名 value是列的值</param>
            public static void SetHash(string key, Dictionary<string, string> value)
            {
                if (null == value || value.Count < 1)
                {
                    return;
                }
                try
                {
                    HashEntry[] array = (from item in value select new HashEntry(item.Key, item.Value)).ToArray();
                    IDatabase db = GetDatabase();
                    db.HashSet(key, array);
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("设置Hash类型缓存异常,缓存key={0},缓存对象值={1}", key, string.Join(",", value)), ex);
                }
            }
    
            /// <summary>
            /// 根据key和列数组从缓存中拿取数据(如果fieldList为空或者个数小于0返回null)
            /// </summary>
            /// <param name="key">缓存Key</param>
            /// <param name="fieldList">列数组</param>
            /// <returns>根据列数组构造一个字典,字典中的列与入参列数组相同,字典中的值是每一列的值</returns>
            public static Dictionary<string, string> GetHash(string key, List<string> fieldList)
            {
                if (null == fieldList || fieldList.Count < 1)
                {
                    return null;
                }
                try
                {
                    Dictionary<string, string> dic = new Dictionary<string, string>();
                    RedisValue[] array = (from item in fieldList select (RedisValue)item).ToArray();
                    IDatabase db = GetDatabase();
                    RedisValue[] redisValueArray = db.HashGet(key, array);
                    for (int i = 0; i < redisValueArray.Length; i++)
                    {
                        string field = fieldList[i];
                        string value = redisValueArray[i];
                        dic.Add(field, value);
                    }
                    return dic;
                }
                catch (Exception ex)
                {
                    LogHelper.Error(typeof(RedisHelper), string.Format("获取Hash类型缓存异常,缓存key={0},列数组={1}", key, string.Join(",", fieldList)), ex);
                }
                return null;
            }
    
            /// <summary>
            /// 使用Redis incr 记录某个Key的调用次数
            /// </summary>
            /// <param name="key"></param>
            public static long SaveInvokeCount(string key)
            {
                try
                {
                    return GetDatabase().StringIncrement(key);
                }
                catch { return -1; }
            }
    
            /// <summary>
            /// 配置更改时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
            {
                LogHelper.Warn(typeof(RedisHelper), "MuxerConfigurationChanged=>e.EndPoint=" + e.EndPoint, null);
            }
    
            /// <summary>
            /// 发生错误时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
            {
                LogHelper.Error(typeof(RedisHelper), "MuxerErrorMessage=>e.EndPoint=" + e.EndPoint + ",e.Message=" + e.Message, null);
            }
    
            /// <summary>
            /// 重新建立连接
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
            {
                LogHelper.Warn(typeof(RedisHelper), "MuxerConnectionRestored=>e.ConnectionType=" + e.ConnectionType + ",e.EndPoint=" + e.EndPoint + ",e.FailureType=" + e.FailureType, e.Exception);
            }
    
            /// <summary>
            /// 连接失败
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
            {
                LogHelper.Error(typeof(RedisHelper), "MuxerConnectionFailed=>e.ConnectionType=" + e.ConnectionType + ",e.EndPoint=" + e.EndPoint + ",e.FailureType=" + e.FailureType, e.Exception);
            }
    
            /// <summary>
            /// 更改集群
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
            {
                LogHelper.Warn(typeof(RedisHelper), "MuxerHashSlotMoved=>" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint, null);
            }
    
            /// <summary>
            /// redis类库错误
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
            {
                LogHelper.Error(typeof(RedisHelper), "MuxerInternalError", e.Exception);
            }
        }
    }
        //写String 缓存1小时
        RedisHelper.SetString(subID, "AXB", new TimeSpan(1, 0, 0, 0));
    
        //写String 缓存5分钟
        RedisHelper.SetString(mobile + "_car", equipmentType, TimeSpan.FromMinutes(5));
    
        //写String 
        RedisHelper.SetString(strNum, strCity);
    
        //读String
        string strTime = RedisHelper.GetString(mobile);
  • 相关阅读:
    double 和 int 同时存在时的运算
    快速排序
    案例:商品放大镜效果
    淘宝flexible.js源码分析
    案例:模态框拖拽
    Web APIs——BOM
    案例:获取URL参数数据
    案例:5秒之后自动跳转页面
    JS中this指针的指向
    按钮:点击发送短信按钮60秒内不能再次点击的功能
  • 原文地址:https://www.cnblogs.com/woadmin/p/10399624.html
Copyright © 2011-2022 走看看