使用Java操作redis的时候报错,但是我的redis启动了,那么究竟是神马原因导致连接失败呢?
可能得方式有三种,密码,防火墙,网络
1.网络畅通,没毛病,能ping通
2.密码:redis还需要密码来登录,通过redis.conf中的
#requirepass foobared
修改为requirepass root
重新启动redis
./redis-server ../redis.conf
3.防火墙:因为使用centos7,那么关闭防火墙命令systemctl disable firewall.service
这轮走下来,应该没问题了吧,因为我使用Java操作redis,还是报错,那么我就查看代码,发现没有带密码,导致连接失败,上代码
import java.util.Iterator; import redis.clients.jedis.Jedis; /** * redis操作api * @author ALL * */ public class RedisClient { /** * 保存数据 */ @SuppressWarnings("deprecation") public static void setDataToRedis(String setName,String[] datas){ Jedis redisClient = null; try { redisClient=RedisClientPool.jedisPool.getResource(); for (String data:datas) { redisClient.sadd(setName, data); } System.out.println("save data success-------------------------"+setName); } catch (Exception e) { e.printStackTrace(); // 销毁对象 RedisClientPool.jedisPool.returnBrokenResource(redisClient); }finally{ // 还原到连接池 RedisClientPool.jedisPool.returnResource(redisClient); } } /** * 获取set集合中的数据 * @param setName * @param values */ public static boolean getDataFromRedis(String setName,String values){ Jedis redisClient = null; try { redisClient=RedisClientPool.jedisPool.getResource(); return redisClient.sismember(setName, values);//判断 who 是否是user集合的元素 //System.out.println(redisClient.srandmember(setName)); //System.out.println(redisClient.scard(setName));//返回集合的元素个数 } catch (Exception e) { // 销毁对象 RedisClientPool.jedisPool.returnBrokenResource(redisClient); }finally{ // 还原到连接池 RedisClientPool.jedisPool.returnResource(redisClient); } return false; } public static void flushAllData(){ Jedis redisClient = null; try { redisClient=RedisClientPool.jedisPool.getResource(); redisClient.flushAll(); } catch (Exception e) { // 销毁对象 RedisClientPool.jedisPool.returnBrokenResource(redisClient); }finally{ // 还原到连接池 RedisClientPool.jedisPool.returnResource(redisClient); } } } import java.io.File; import java.io.FileReader; import java.util.Properties; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * redis连接池 * @author ALL * */ public class RedisClientPool { public static JedisPool jedisPool; private static String redisHost; private static String redisPort; static{ Properties properties=new Properties(); try { String path=RedisClientPool.class.getResource("/resource.properties").getPath(); properties.load(new FileReader(new File(path))); redisHost=properties.getProperty("redisHost"); redisPort=properties.getProperty("redisPort"); } catch (Exception e) { e.printStackTrace(); } } public static RedisClientPool redisClientPool=getInstance(); public static void main(String[] args) { System.out.println(redisHost); } public static synchronized RedisClientPool getInstance() { if(null==redisClientPool){ redisClientPool=new RedisClientPool(); } return redisClientPool; } public RedisClientPool(){ if(null==jedisPool){ init(); } } /** * 初始化jedis连接池 */ public static void init() { JedisPoolConfig jedisPoolConfig=initJedisPoolConfig(); String host=redisHost; System.out.println(redisPort); int port=Integer.valueOf(redisPort); int timeout=1000; //构造连接池,如果redis设置密码,那么在此处也把密码加上 jedisPool=new JedisPool(jedisPoolConfig,host,port,timeout,""); } /** * 初始化jedis * @return */ private static JedisPoolConfig initJedisPoolConfig() { JedisPoolConfig jedisPoolConfig=new JedisPoolConfig(); //控制一个pool最多有多少个状态为idle的jedis的实力 jedisPoolConfig.setMaxIdle(1000); //最大能够保持空闲状态的对象数目 jedisPoolConfig.setMaxTotal(300);; //超时时间 jedisPoolConfig.setMaxWaitMillis(1000); // 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的; jedisPoolConfig.setTestOnBorrow(true); // 在还会给pool时,是否提前进行validate操作 jedisPoolConfig.setTestOnReturn(true); return jedisPoolConfig; } }