使用哨兵模式連接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>
問題解決