• Unable to Connect: sPort: 0 C# ServiceStack.Redis 访问 redis


    需求:  对数据库中的不断抓取的文章进行缓存,因此需要定时访问数据,写入缓存中

    在捕获到的异常日志发现错误:Unable to Connect: sPort: 0 

    使用的访问方式是线程池的方式:PooledRedisClientManager

    经过测试发现在并发访问redis服务的情况下出现该异常的概率比较高,

    解决方法

    第一点:要使用using(据说访问效率在高并发的时候会有影响,简单的测试过了确实是这样,不过现在的业务达不到高并发量,速度还是很快滴)

    using (IRedisClient redisClient = Instance.GetClient())
                {
                    T t = redisClient.Get<T>(key);
                    if (t == null && func != null)
                    {
                        t = func();
                        redisClient.Set<T>(key, t, DateTime.Now.AddSeconds(seconds));
                    }
                    return t;
                }  

    第二点:设置ConnectTimeout属性(猜测单位应该是毫秒),要设置一个比较大的值,我设置为:1000 * 60 * 20  ,没错是20分钟,我发现设置小了还是不管用

    做好这两点,经测试发现每秒钟200个并发量 毫无压力

    附上封装的一个帮助类:

    /// <summary>
        /// 数据缓存
        /// </summary>
        public class RedisHelper
        {
            public static PooledRedisClientManager instance;
    
            static RedisHelper()
            {
            }
            public static PooledRedisClientManager Instance
            {
                get
                {
                    return instance;
                }
            }public static void InitClient(string redis_ip, int redis_port, string redis_pass)
            {
                instance = new PooledRedisClientManager(10000,
                                               10,
                                               new string[] { string.Format("{0}@{1}:{2}", redis_pass, redis_ip, redis_port) })
                {
                    ConnectTimeout = 1000 * 60 * 20
                };
            }
    
            
            public static T Get<T>(string key, int seconds, Func<T> func)
            {
                using (IRedisClient redisClient = Instance.GetClient())
                {
                    T t = redisClient.Get<T>(key);
                    if (t == null && func != null)
                    {
                        t = func();
                        redisClient.Set<T>(key, t, DateTime.Now.AddSeconds(seconds));
                    }
                    return t;
                }
    
            }
            public static T Get<T>(string key)
            {
                using (IRedisClient redisClient = Instance.GetReadOnlyClient())
                {
                    T t = redisClient.Get<T>(key);
                    return t;
                }
    
            }
            public static Boolean Set<T>(string key, int seconds, T t)
            {
                using (IRedisClient redisClient = Instance.GetClient())
                {
                    return redisClient.Set<T>(key, t, DateTime.Now.AddSeconds(seconds));
                }
            }
    
            public static void ClearKey(string key)
            {
                using (IRedisClient redisClient = Instance.GetClient())
                {
                    IEnumerable<string> keys = redisClient.GetAllKeys(); ;
                    foreach (var item in keys)
                    {
                        if (item.Contains(key))
                        {
                            redisClient.Remove(item);
                        }
                    }
                }
    
            }
        }
  • 相关阅读:
    CentOS yum 源的配置与使用
    CentOS 添加常用 yum 源
    给centOs添加epel源
    centos 推荐使用epel源
    如何在CentOS 5/6上安装EPEL 源
    为centos添加第三方源
    Linux远程桌面工具 -- NoMachine
    Redis windows版本的启停bat脚本命令
    Elasticsearch+Hbase实现海量数据秒回查询
    mysql 与elasticsearch实时同步常用插件及优缺点对比(ES与关系型数据库同步)
  • 原文地址:https://www.cnblogs.com/kongkonglonglong/p/7449175.html
Copyright © 2020-2023  润新知