Redis多实例创建连接开销的一些疑问?
2016-07-20 来自:苏艾Brenda 4 人回应
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的方式又额外的带来了开销,各位大神 有没有什么好的方式可以解决这样矛盾的问题。

2016-07-25 来自:BAD鼻血

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

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

2016-07-25 来自:donkey

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

2016-07-20 来自:承轩

这种场景直接可以用pipeline 来解决。

貌似c#的驱动里没这个命令,需要自己实现。可以搜索下,代码会很多的。

2016-07-20 来自:抱抱小恴儿

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

您的回应

你还未登陆,不能回应!登陆