使用哨兵模式連接redis連接池時,遇到錯誤:
Caused by: redis.clients.jedis.exceptions.JedisDataException:
ERR Client sent AUTH, but no password is set
發現是redis沒有設置密碼,程序卻發送了auth選項。
工程裏JedisSentinelPool是通過spring配置的:
<bean id="jedisPool" class="redis.clients.jedis.JedisSentinelPool" destroy-method="destroy">
<constructor-arg value="${redis.master}" />
<constructor-arg>
<set>
<value>${redis.host}:${redis.port}</value>
</set>
</constructor-arg>
<constructor-arg ref="jedisPoolConfig" />
<constructor-arg value="${redis.timeout}"/>
</bean>
發現JedisSentinelPool的構造方法有2個類似的:
public JedisSentinelPool(String masterName, Set sentinels,
GenericObjectPoolConfig poolConfig, int timeout) {
this(masterName, sentinels, poolConfig, timeout, null, 0);
}
public JedisSentinelPool(String masterName, Set sentinels,
GenericObjectPoolConfig poolConfig, String password) {
this(masterName, sentinels, poolConfig, 2000, password);
}
JedisSentinelPool初始化構造方法的入參是根據spring配置文件的參數配置順序加載的,JedisSentinelPool使用了第二個構造方法,導致上面的錯誤。
解決方法,給配置文件的參數配置name屬性.
<bean id="jedisPool" class="redis.clients.jedis.JedisSentinelPool" destroy-method="destroy">
<constructor-arg name="masterName" value="${redis.master}" />
<constructor-arg name="sentinels">
<set>
<value>${redis.host}:${redis.port}</value>
</set>
</constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="timeout" value="${redis.timeout}"/>
</bean>
問題解決