标签:
当开始用 var result=new RedisClient("127.0.0.1",6379,1"1111"); 这个helper ,后面有并发之后就一直提示超时问题。
后面改为连接池(集群的方式)
 /// <summary>
        /// 连接客户端管理
        /// </summary>
        private static PooledRedisClientManager prcm;
 /// <summary>
        /// 创建链接池管理对象
        /// </summary>
        public static PooledRedisClientManager CreateManager()
        {
            string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
            string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");
           return  new PooledRedisClientManager(writeServerList, readServerList,
                             new RedisClientManagerConfig
                             {
                                 MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
                                 MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,
                                 DefaultDb = redisConfigInfo.InitalDb,
                                 AutoStart = redisConfigInfo.AutoStart,
                             }); //, redisConfigInfo.InitalDb
        }
 /// <summary>
        /// 客户端缓存操作对象
        /// </summary>
        public static IRedisClient GetClient()
        {
            if (OpenRedis)
            {
                    if (prcm == null)
                    {
 prcm = CreateManager();
                    }
                    return prcm.GetClient();
            }
            return null;
        }
但发现用同一个还是连接池并发大还是有问题,从日志上面看
Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.
异常信息:System.TimeoutException: Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.
could not connect to redis Instance at 127.0.0.1:6379
异常信息:ServiceStack.Redis.RedisException: could not connect to redis Instance at 127.0.0.1:6379 ---> System.Net.Sockets.SocketException: 在一个非套接字上尝试了一个操作。 127.0.0.1:6379
后面在网上查找的时候看到使用using 的方法。 跟连接数据库一样的道理,还有开多线程会报错,要加local锁
RedisConfigInfo类
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
namespace Cache.Redis
{
    /// <summary>
    /// 获取redis配置的类
    /// </summary>
    public sealed class RedisConfigInfo:ConfigurationSection
    {
        public static RedisConfigInfo GetConfig()
        {
            var section = (RedisConfigInfo)System.Configuration.ConfigurationManager.GetSection("RedisConfig");
            return section;
        }
        public static RedisConfigInfo GetConfig(string sectionName)
        {
            var section = (RedisConfigInfo)ConfigurationManager.GetSection("RedisConfig");
            if (section == null)
            {
                throw new ConfigurationErrorsException("Section " + sectionName + " is not found.");
            }
            return section;
        }
        /// <summary>
        /// 可写的Redis链接地址
        /// </summary>
        [ConfigurationProperty("WriteServerList", IsRequired = false)]
        public string WriteServerList
        {
            get
            {
                return (string)base["WriteServerList"];
            }
            set {
                base["WriteServerList"] = value;
            }
        }
        /// <summary>
        ///  可读的Redis链接地址,它一般由多个服务器组件,一般称为从服务器(slave),各个服务器之间用逗号分开
        /// </summary>
        [ConfigurationProperty("ReadServerList", IsRequired = false)]
        public string ReadServerList
        {
            get
            {
                return (string)base["ReadServerList"];
            }
            set
            {
                base["ReadServerList"] = value;
            }
        }
        /// <summary>
        /// 最大写链接数
        /// </summary>
         [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]
        public int MaxWritePoolSize
        {
            get
            {
                return (int)base["MaxWritePoolSize"];
            }
            set
            {
                base["MaxWritePoolSize"] = value;
            }
        }
         /// <summary>
         ///  初始化哪个库
         /// </summary>
         [ConfigurationProperty("InitalDb", IsRequired = false)]
         public long InitalDb
         {
             get
             {
                 return (long)base["InitalDb"];
             }
             set
             {
                 base["InitalDb"] = value;
             }
         }
         /// <summary>
         /// 最大写链接数
         /// </summary>
         [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]
         public int MaxReadPoolSize
         {
             get
             {
                 return (int)base["MaxReadPoolSize"];
             }
             set
             {
                 base["MaxReadPoolSize"] = value;
             }
         }
         /// <summary>
         ///  自动重启
         /// </summary>
        [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)]
         public bool AutoStart
         {
             get
             {
                 return (bool)base["AutoStart"];
             }
             set
             {
                 base["AutoStart"] = value;
             }
         }
        /// <summary>
        ///  本地缓存到期时间,单位:秒
        /// </summary>
        [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)]
        public int LocalCacheTime
        {
            get
            {
                return (int)base["LocalCacheTime"];
            }
            set
            {
                base["LocalCacheTime"] = value;
            }
        }
        /// <summary>
        ///   是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项
        /// </summary>
        [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]
        public bool RecordeLog
        {
            get
            {
                return (bool)base["RecordeLog"];
            }
            set
            {
                base["RecordeLog"] = value;
            }
        }
        /// <summary>
        /// 超时时间
        /// </summary>
        [ConfigurationProperty("PoolTimeOutSeconds", IsRequired = false, DefaultValue = 5000)]
        public int PoolTimeOutSeconds
        {
            get
            {
                return (int)base["PoolTimeOutSeconds"];
            }
            set
            {
                base["PoolTimeOutSeconds"] = value;
            }
        }
    }
}
RedisOperatorBase类
using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Cache.Redis
{
    /// <summary>
    /// Redis回收类
    /// </summary>
    public abstract class RedisOperatorBase : IDisposable
    {
        protected static object lockobj = new object();
        private bool _disposed = false;
        protected RedisOperatorBase()
        {
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                }
            }
            this._disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 保存数据DB文件到硬盘
        /// </summary>
        public void Save()
        {
        }
        /// <summary>
        /// 异步保存数据DB文件到硬盘
        /// </summary>
        public void SaveAsync()
        {
        }
        
    }
}
RedisManager redis管理的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Redis;
namespace Cache.Redis
{
    /// <summary>
    /// redis管理的类
    /// </summary>
    public class RedisManager
    {
       public  static bool OpenRedis = System.Configuration.ConfigurationManager.AppSettings["OpenRedis"] == null ? false : Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["OpenRedis"]);
        /// <summary>
        /// redis配置文件信息
        /// </summary>
        private static RedisConfigInfo redisConfigInfo = RedisConfigInfo.GetConfig();
        /// <summary>
        /// 创建链接池管理对象
        /// </summary>
        public static PooledRedisClientManager CreateManager()
        {
            string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
            string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");
            return new PooledRedisClientManager(writeServerList, readServerList,
                              new RedisClientManagerConfig
                              {
                                  MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
                                  MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,
                                  DefaultDb = redisConfigInfo.InitalDb,
                                  AutoStart = redisConfigInfo.AutoStart,
                              }); //, redisConfigInfo.InitalDb
        }
        /// <summary>
        /// 得到连接数组
        /// </summary>
        /// <param name="strSource"></param>
        /// <param name="split"></param>
        /// <returns></returns>
        private static string[] SplitString(string strSource, string split)
        {
            return strSource.Split(split.ToArray());
        }
    }
}
Redis string get set的类
using ServiceStack.Redis;
using ServiceStack.Text;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Cache.Redis
{
    /// <summary>
    /// redis的string
    /// </summary>
    public class RedisStringOperator : RedisOperatorBase
    {
       
        public RedisStringOperator() : base() { }
        /// <summary>
        ///redis的string 存值
        /// </summary>
        public  bool Set<T>(string key, T t)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.Set(key, t);
                }
            }
          
        }
        /// <summary>
        /// redis的string存值
        /// </summary>
        public  bool Set<T>(string key, T t, DateTime expiresAt)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.Set(key, t, expiresAt);
                }
            }
            //return Redis.Set(key, t, expiresAt);
        }
      
        /// <summary>
        /// 存值
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public  bool Set(string key, string value)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.Set<string>(key, value);
                }
            }
            
        }
        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public  bool Remove(string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.Remove(key);
                }
            }
        }
        /// <summary>
        /// 取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public  T Get<T>(string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                 return default(T);
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.Get<T>(key);
                }
            }
            
        }
     
        /// <summary>
        /// 设置缓存过期
        /// </summary>
        public  bool SetExpire(string key, DateTime datetime)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.ExpireEntryAt(key, datetime);
                }
            }
        }
      
    }
}
RedisHash的类
using ServiceStack.Text;
using System;
using System.Collections.Generic;
namespace Cache.Redis
{
    public class RedisHashOperator : RedisOperatorBase
    {
        public RedisHashOperator() : base() { }
        /// <summary>
        /// 判断某个数据是否已经被缓存
        /// </summary>
        public bool ExistHashContainsEntry(string hashId, string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.HashContainsEntry(hashId, key);
                }
            }
        }
        /// <summary>
        /// 存储数据到hash表
        /// </summary>
        public  bool SetInHash<T>(string hashId, string key, T t)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            var value = JsonSerializer.SerializeToString<T>(t);
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.SetEntryInHash(hashId, key, value);
                }
            }
        }
        /// <summary>
        /// 存储数据到hash表
        /// </summary>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        public  bool SetInHash(string hashId, string key, string value)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.SetEntryInHash(hashId, key, value);
                }
            }
        }
        /// <summary>
        /// 移除hash中的某值
        /// </summary>
        public  bool RemoveFromHash(string hashId, string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return true;
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.RemoveEntryFromHash(hashId, key);
                }
            }
        }
        ///// <summary>
        ///// 移除整个hash
        ///// </summary>
        //public static bool Remove(string key)
        //{
        //    return Redis.Remove(key);
        //}
      
        /// <summary>
        /// 从hash表获取数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public  T GetFromHash<T>(string hashId, string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return default(T);
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    string value = redieclient.GetValueFromHash(hashId, key);
                    return JsonSerializer.DeserializeFromString<T>(value);
                }
            }
            //string value = Redis.GetValueFromHash(hashId, key);
            //return JsonSerializer.DeserializeFromString<T>(value);
        }
        /// <summary>
        /// 从hash表获取数据
        /// </summary>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string GetFromHash(string hashId, string key)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return "";
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.GetValueFromHash(hashId, key);
                }
            }
        }
        
        /// <summary>
        /// 获取整个hash的数据
        /// </summary>
        public static List<T> GetAllFromHash<T>(string hashId)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return new List<T>();
            }
               var result = new List<T>();
               lock (lockobj)
               {
                   using (var redieclient = RedisManager.CreateManager().GetClient())
                   {
                       var list = redieclient.GetHashValues(hashId);
                       if (list != null && list.Count > 0)
                       {
                           list.ForEach(x =>
                           {
                               var value = JsonSerializer.DeserializeFromString<T>(x);
                               result.Add(value);
                           });
                       }
                   }
               }
            return result;
        }
        /// <summary>
        /// 根据hash获取keys
        /// </summary>
        /// <param name="hashId"></param>
        /// <returns></returns>
        public static List<string> GetHashKeys(string hashId)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return new List<string>();
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.GetHashKeys(hashId);
                }
            }
        }
        /// <summary>
        /// 获取整个hash的数据
        /// </summary>
        public static List<string> GetAllFromHash(string hashId)
        {
            if (!Cache.Redis.RedisManager.OpenRedis)
            {
                return new List<string>();
            }
            lock (lockobj)
            {
                using (var redieclient = RedisManager.CreateManager().GetClient())
                {
                    return redieclient.GetHashValues(hashId);
                }
            }
           
        }
     
    }
}
比如string的set方法
 <configSections>
    <!--redis缓存-->
    <section name="RedisConfig" type="Cache.Redis.RedisConfigInfo,Cache" />
  </configSections>
  <!--ServiceStack.Redis 4.0以后的版本的格式    password@IP:port?&db=1&ssl=true&client=aaa&password=123&namespaceprefix=vvv&connecttimeout=10&sendtimeout=10&receivetimeout=10&retrytimeout=10&idletimeout=10-->
  <!--redis缓存  写入地址(如果没有密码则不用@以及@之前的值,如127.0.0.1:6379,有密码则51sole@127.0.0.1:6379)   读的地址                默认数据库是第几个    最大超时时间(秒)     最大写链接数  最大读的链接数        是否自动重启      缓存时间           是否写入日志           -->
  <RedisConfig WriteServerList="127.0.0.1:6379" ReadServerList="127.0.0.1:6379"   InitalDb="3"  PoolTimeOutSeconds="5000" MaxWritePoolSize="5" MaxReadPoolSize="5" AutoStart="true" LocalCacheTime="180" RecordeLog="false">
  </RedisConfig>
string的 get 和set方法
 //
        // GET: /RedisTest/
        public ActionResult Index()
        {
               Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();
               redistring.Set("test", 1);
            return View();
        }
 public ActionResult GetRedisValue()
        {
            Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();
            redistring.Get<int>("test");
        }
          
标签:
原文地址:http://www.cnblogs.com/zhian/p/5669964.html