我的redis服务器在VMWare服务器中,我可以通过cli从telnet连接redis服务器:
C:\Users\Administrator>redis-cli -h 192.168.0.243 -p 6379
192.168.0.243:6379> get name
(error) NOAUTH Authentication required.
192.168.0.243:6379> auth root
OK
192.168.0.243:6379> get name
"pool zzzzqqqqq"
192.168.0.243:6379>
在我的java代码中,我可以通过Jedis成功连接到redis服务器。
JedisDemo:
Jedis jedis = new Jedis(constr) ;
jedis.auth("root");
String output ;
jedis.set( "hello", "world" ) ;
output = jedis.get( "hello") ;
System. out.println(output) ;
但我无法通过JedisPool连接到redis服务器: 这是代码:
RedisUtils.java:
public class RedisUtils {
private JedisPool pool = null;
private final static String REDIS_IP = "192.168.0.243";
private final static int REDIS_PORT = 6379;
public RedisUtils() {
this(REDIS_IP,REDIS_PORT);
}
public RedisUtils(String ip, int prot) {
if (pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100);
config.setMaxIdle(10);
config.setMaxWaitMillis(50 * 1000);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
config.setTestWhileIdle(true);
pool = new JedisPool(config, ip, prot, 100000,"root");
}
}
public RedisUtils(JedisPoolConfig config ,String ip, int prot){
if (pool == null) {
pool = new JedisPool(config,ip,prot,10000);
}
}
public RedisUtils(JedisPoolConfig config ,String ip, int prot ,int timeout){
if (pool == null) {
pool = new JedisPool(config,ip,prot,timeout);
}
}
public RedisUtils(JedisPool pool){
if (this.pool == null) {
this.pool = pool;
}
}
public String get(String key){
Jedis jedis = null;
String value = null;
try {
jedis = pool.getResource();
value = jedis.get(key);
} catch (Exception e) {
pool.close();
e.printStackTrace();
} finally {
returnResource(pool, jedis);
}
return value;
}
public String set(String key,String value){
Jedis jedis = null;
try {
jedis = pool.getResource();
return jedis.set(key, value);
} catch (Exception e) {
pool.close();
e.printStackTrace();
return "0";
} finally {
returnResource(pool, jedis);
}
}
...
RedisDemo
RedisUtils redisUtils = new RedisUtils();
redisUtils.set("name", "pool zzzzqqqqq");
System.out.println("get name : "+redisUtils.get("name"));
结果:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at com.mbg.redis.RedisUtils.get(RedisUtils.java:122)
at com.mbg.redis.RedisDemo.poolTest(RedisDemo.java:25)
at com.mbg.redis.RedisDemo.main(RedisDemo.java:35)
Caused by: java.lang.IllegalStateException: Pool not open
at org.apache.commons.pool2.impl.BaseGenericObjectPool.assertOpen(BaseGenericObjectPool.java:672)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:412)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)
... 4 more
你能告诉我为什么吗?
提前谢谢!
答案 0 :(得分:0)
我不确定您是否可以在JedisPool实例中使用password参数来模拟AUTH命令。</ p>
试试这个:
public String set(String key,String value){
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.auth("root");
return jedis.set(key, value);
} catch (Exception e) {
pool.close();
e.printStackTrace();
return "0";
} finally {
returnResource(pool, jedis);
}
}