首页 新闻 搜索 专区 学院

Redis多实例创建连接开销的一些疑问?

0
[待解决问题]
var redis = new RedisClient(Ip, Point);

使用了如上代码,来创建Redis,考虑到创建连接会产生开销,就使用了单例模式来进行创建。

if (Redis == null)
            {
                lock (obj)
                {
                    if (Redis == null)
                    {
                        if (string.IsNullOrEmpty(redisConfigValue))
                        {
                            throw new Exception("请检查您的配置文件是否正确配置");
                        }
                        try
                        {
                           var config= JsonConvert.DeserializeObject<RedisConfig>(redisConfigValue);
                           if (string.IsNullOrEmpty(config.PassWord))
                           {
                               Redis = new RedisClient(config.Ip, config.Point);
                           }
                           else
                           {
                               Redis = new RedisClient(config.Ip, config.Point, config.PassWord);
                           }
                        }
                        catch (Exception ex)
                        {
                            throw;
                        }
                    }
                }
            }

这种单例模式的方式比每次需要使用都去new一个对象的方式可以节约一些开销。但是这种方式只适合对同一台redis服务器进行操作。假如有3台redis服务器,那么使用这种单例模式就不是很好来切换要连接的redis。反而是直接通过 new 的方式来创建更加适合来进行不同redis的链接操作,但是使用new的方式又额外的带来了开销,各位大神 有没有什么好的方式可以解决这样矛盾的问题。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2016-07-08 15:52
< >
分享
所有回答(3)
0

如果数据量很大就一个连接的这种单例模式应该会挂掉才对,所以效率反倒比不上每次new一下,其实比较成熟的方案照抄mysql这类数据库就可以,建一个专门的额连接池来做到连接的重用,修改参数来适应不同并发的需求,记得c#里有专门的连接池类已经写好了。

today4king | 园豆:3267 (老鸟四级) | 2016-07-08 16:12
0

这种第一次new的开销是肯定少不了的,不过redisclient都有连接池功能,然后你自己cache下对应的对象不就可以了么?

Daniel Cai | 园豆:10374 (专家六级) | 2016-07-08 16:46
0

PooledClientManager ,名字大概就是这个样子的。这个就应该是解决你这个问题的吧 。

不过,这个的分布式方案只有轮询的方式。

| 园豆:770 (小虾三级) | 2016-07-09 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册