C# 中Redis缓存的使用

1、项目引用类库

        StackExchange.Redis 包

        Newtonsoft.Json 包

2、C#帮助类代码

    /// 
    /// Redis帮助类
    /// 
    public class RedisHelper
    {
        private static readonly string ConnectionString = "127.0.0.1:6379,password=123456,connectTimeout=1000,connectRetry=1,syncTimeout=1000";

        /// <summary>
        /// 上锁,单例模式
        /// </summary>
        private static object locker = new object();

        #region 链接对象、数据库对象 (私有字段和属性)
        /// <summary>
        /// 连接对象
        /// </summary>
        private volatile IConnectionMultiplexer _connection;

        /// <summary>
        /// 连接对象
        /// </summary>
        /// <returns></returns>
        private IConnectionMultiplexer Connection
        {
            get
            {
                if (_connection != null && _connection.IsConnected)                
                    return _connection;
                
                lock (locker)
                {
                    if (_connection != null)
                    {
                        if (_connection.IsConnected)
                            return _connection;
                        else _connection.Dispose();
                    }
                    _connection = ConnectionMultiplexer.Connect(ConnectionString);
                }

                return _connection;
            }
        }

        /// <summary>
        /// 数据库对象
        /// </summary>
        private volatile IDatabase _db;

        /// <summary>
        /// 数据库对象
        /// </summary>
        private IDatabase Db
        {
            get
            {
                if (_db != null)
                    return _db;
                _db = Connection.GetDatabase();
                return _db;
            }
            set
            {
                _db = value;
            }
        }
        #endregion

        #region 实例化帮助对象、设置数据库ID、数据库连接对象
        /// <summary>
        /// 私有构造函数
        /// </summary>
        private RedisHelper()
        {
            _connection = ConnectionMultiplexer.Connect(ConnectionString);
            SetDatabase();
        }

        /// <summary>
        /// 实例化对象
        /// </summary>
        private static RedisHelper redisHelper;

        /// <summary>
        /// 实例化
        /// </summary>
        public static RedisHelper Instance
        {
            get
            {
                if (redisHelper == null)                
                    lock (locker)
                    {
                        if (redisHelper == null)                        
                            redisHelper = new RedisHelper();                        
                    }                
                return redisHelper;
            }
        }

        /// <summary>
        /// 获取数据库
        /// </summary>
        /// <param name="db">要获取的数据库ID</param>
        /// <returns></returns>
        public void SetDatabase(int? db = null)
        {
            Db = Connection.GetDatabase(db ?? -1);
        }
        #endregion

        #region Redis 验证对象是否存在、删除对象、添加对象

        /// <summary>
        /// 判断键是否已存在
        /// </summary>
        /// <param name="key">关键字</param>
        /// <returns></returns>
        public bool IsExit(string key)
        {
            return Db.KeyExists(key);
        }

        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="key">关键字</param>
        /// <returns>如果存在则删除,不存在时则直接返回false</returns>
        public virtual bool Delete(string key)
        {
            if (IsExit(key))
                return Db.KeyDelete(key);
            return false;
        }

        /// <summary>
        /// 获取字符串值
        /// </summary>
        /// <param name="key">关键字</param>
        /// <returns></returns>
        public virtual string GetString(string key)
        {
            return Db.StringGet(key);
        }

        /// <summary>
        /// 设置字符串值
        /// </summary>
        /// <param name="key">关键字</param>
        /// <param name="value">值</param>
        /// <param name="cacheTime">有效期(分钟)</param>
        public virtual bool SetString(string key, string value, int? cacheTime = null)
        {
            if (cacheTime != null)
                return Db.StringSet(key, value, TimeSpan.FromMinutes(Convert.ToDouble(cacheTime)));
            else
                return Db.StringSet(key, value);
        }

        /// <summary>
        /// 获取对象值
        /// </summary>
        /// <param name="key">关键字</param>
        /// <returns></returns>
        public virtual T Get<T>(string key)
        {
            string value = GetString(key);
            if (string.IsNullOrEmpty(value))
                return default(T);
            else
                return JsonConvert.DeserializeObject<T>(value);
        }

        /// <summary>
        /// 设置对象缓存
        /// </summary>
        /// <param name="key">关键字</param>
        /// <param name="value">值</param>
        /// <param name="cacheTime">有效期(分钟)</param>
        public virtual void Set<T>(string key, T value, int? cacheTime = null)
        {
            if (value == null) return;

            string data = JsonConvert.SerializeObject(value);
            if (cacheTime != null)
                SetString(key, data, cacheTime);
            else
                SetString(key, data);
        }
        #endregion

        #region Redis List列表操作

        /// <summary>
        /// 推入列表
        /// </summary>
        /// <param name="key">列表关键字</param>
        /// <param name="value">值</param>
        /// <param name="IsTop">是否插入头部</param>
        /// <returns></returns>
        public virtual long ListPush<T>(string key, T value, bool IsTop = false)
        {
            if (value == null)
                return Db.ListLength(key);
            string data = JsonConvert.SerializeObject(value);
            if (IsTop)
                return Db.ListLeftPush(key, data);
            else
                return Db.ListRightPush(key, data);
        }

        /// <summary>
        /// 取出列表值
        /// </summary>
        /// <param name="key">列表关键字</param>
        /// <param name="IsTop">是否从头部取</param>
        /// <returns></returns>
        public virtual T ListPop<T>(string key, bool IsTop = false)
        {
            string value = string.Empty;
            if (IsTop)
                value = Db.ListLeftPop(key);
            else
                value = Db.ListRightPop(key);

            if (value == null)
                return default(T);
            return JsonConvert.DeserializeObject<T>(value);
        }

        /// <summary>
        /// 获取列表长度
        /// </summary>
        /// <param name="key">列表关键字</param>
        /// <returns></returns>
        public virtual long GetListLength(string key)
        {
            return Db.ListLength(key);
        }
        #endregion

        #region 清空Redis数据库
        /// <summary>
        /// 清空缓存数据库
        /// </summary>
        /// <returns></returns>
        public virtual void FlushDatabase(int db=-1)
        {
            using (ConnectionMultiplexer connection = ConnectionMultiplexer.Connect($"{ConnectionString},allowAdmin=true"))
            {
                IServer server = connection.GetServer(ConnectionString.Split(',')[0]);
                if (server != null)
                    server.FlushDatabase(db);
            }
        }
        #endregion
    }

3、调用测试代码

    public class KS
    {
        public string XM { get; set; }
        public string SFZH { get; set; }
        public int CJ { get; set; }
    }


     RedisHelper.Instance.SetString("XM", "小明");
     string v = RedisHelper.Instance.GetString("XM");

      KS kS= new KS() { XM="小刚",SFZH="1238975645645643123",CJ=670 };
      RedisHelper.Instance.Set<KS>(kS.SFZH, kS);
      KS ks = RedisHelper.Instance.Get<KS>(kS.SFZH);

      RedisHelper.Instance.FlushDatabase();

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值