項目中使用jedis客戶端操作redis
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
代碼沒有變更,換個環境本地運行異常:
redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:51) at redis.clients.jedis.ShardedJedisPool.getResource(ShardedJedisPool.java:36)
Caused by: java.util.NoSuchElementException: Unable to validate object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:495) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362) at redis.clients.util.Pool.getResource(Pool.java:49)
首先確定網絡可通,linux防火牆開放了端口。
然后使用自帶的redis-cli.exe連接
提示NOAUTH Authentication required.
明顯是設置了密碼。
於是查看配置文件找到 requirepass,確定設置了密碼。
通過驗證密碼,客戶端使用正常。
順藤摸瓜找到Jedis的配置 ShardedJedisPool
JedisShardInfo有password屬性
此項需要根據實際redis的配置密碼的情況設置password,如果拿到的密碼為空,則不設置即可。
參考代碼:
@Bean public ShardedJedisPool getJedisPool() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMinIdle(minIdle); jedisPoolConfig.setMaxWaitMillis(maxWait); jedisPoolConfig.setTestOnBorrow(true); jedisPoolConfig.setTestOnReturn(true); jedisPoolConfig.setBlockWhenExhausted(false); JedisShardInfo jedisShardInfo = new JedisShardInfo(host, port); if(!ToolUtil.isEmpty(password)){ jedisShardInfo.setPassword(password); } List<JedisShardInfo> list = new LinkedList<JedisShardInfo>(); list.add(jedisShardInfo); return new ShardedJedisPool(jedisPoolConfig, list); }