Redis 连接池

我们工程中的redis使用主从结构。最近两天我想到一个问题:当redis执行读命令的时候,是从master中读取,还是slaves中读取呢?

经过阅读代码和日志,发现无论是写操作还是读操作,都是master中操作,原因是每次操作的连接都是从master连接池中获取。在配置文件中只写了sentinels的ip和port,通过sentinel get-master-addr-by-name masterName命令可以得到master的地址,从而建立连接池。因为这些逻辑在源码中没有,所以功能都得自己实现,具体做法是让自己的类继承源码中类。

除了连接池,还有N个监控线程(N是sentinels的数量),它们订阅sentinels的channel,监控故障转移的信息。

最后说下连接池的参数,从这些参数中可以理解连接池的原理。

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//指定连接池中最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//连接池中创建的最大连接数
jedisPoolConfig.setMaxTotal(1000);
//设置创建连接的超时时间
jedisPoolConfig.setMaxWaitMillis(2000);
//清理无用连接的时间间隔
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(60000);
//表示连接池在创建链接的时候会先测试一下链接是否可用,这样可以保证连接池中的链接都可用的。
jedisPoolConfig.setTestOnBorrow(true);

JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379); 

对比一下Druid连接池(Druid数据库连接池使用)两者有很多相似之处。

你可能感兴趣的:(Redis 连接池)