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的方式又额外的带来了开销,各位大神 有没有什么好的方式可以解决这样矛盾的问题。
如果数据量很大就一个连接的这种单例模式应该会挂掉才对,所以效率反倒比不上每次new一下,其实比较成熟的方案照抄mysql这类数据库就可以,建一个专门的额连接池来做到连接的重用,修改参数来适应不同并发的需求,记得c#里有专门的连接池类已经写好了。
这种第一次new的开销是肯定少不了的,不过redisclient都有连接池功能,然后你自己cache下对应的对象不就可以了么?
PooledClientManager ,名字大概就是这个样子的。这个就应该是解决你这个问题的吧 。
不过,这个的分布式方案只有轮询的方式。