Redis获取不到连接

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Smile___you/article/details/79169989

Redis获取不到连接问题

问题场景
    我们在继承Redis的时候,可能只是一个简单的集成,保证可以存取数据就可以了,但是有的时候我们使用云Redis的时候,就会出现Redis无法获取连接的情况,究其原因是因为我们自己集成Redis的时候没有为Redis设置密码,云Redis一般都会设置访问密码,这样就造成了无法获取连接的问题出现。

解决方案
    为我们的Reids设置密码,在配置Redis的时候加上密码设置,如下
这里写图片描述

展开阅读全文

spring boot整合redis获取异常或者获取不到

10-09

系统异常:org.springframework.data.redis.RedisConnecrntionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the poolrnrn刚启动系统运行正常,过几天就会出现这个异常,以下是关于redise的配置:rn# redis.properties文件中的内容如下:rnredis.hostName=127.0.0.1rnredis.password=rn#端口号 rnredis.port=6379rn#客户端超时时间单位是毫秒 默认是2000 rnredis.timeout=10000 rnrn#最大空闲数 rnredis.maxIdle=300 rn#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal rn#redis.maxActive=600 rn#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性 rnredis.maxTotal=300rn#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 rnredis.maxWaitMillis=1000 rn#连接的最小空闲时间 默认1800000毫秒(30分钟) rnredis.minEvictableIdleTimeMillis=300000 rn#每次释放连接的最大数目,默认3 rnredis.numTestsPerEvictionRun=1024 rn#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 rnredis.timeBetweenEvictionRunsMillis=30000 rn#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 rnredis.testOnBorrow=true rn#在空闲时检查有效性, 默认false rnredis.testWhileIdle=true rnrn# pom.xml中整合redis内容如下:rn rn org.springframework.bootrn spring-boot-starter-data-redisrn rn rn rn# redisConfig内容如下:rn package com.brons.trans.redis;rnrnimport org.slf4j.Logger;rnimport org.slf4j.LoggerFactory;rnimport org.springframework.beans.factory.annotation.Value;rnimport org.springframework.context.annotation.Bean;rnimport org.springframework.context.annotation.Configuration;rnimport org.springframework.context.annotation.PropertySource;rnimport org.springframework.data.redis.connection.RedisConnectionFactory;rnimport org.springframework.data.redis.connection.jedis.JedisConnectionFactory;rnimport org.springframework.data.redis.core.RedisTemplate;rnimport org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;rnimport org.springframework.data.redis.serializer.StringRedisSerializer;rnrnimport redis.clients.jedis.JedisPoolConfig;rnrn@Configurationrn@PropertySource("classpath:redis.properties")rnpublic class RedisConfig rnrn Logger logger = LoggerFactory.getLogger(RedisConfig.class);rn @Value("$redis.hostName")rn private String hostName;rnrn @Value("$redis.port")rn private Integer port;rnrn @Value("$redis.password")rn private String password;rnrn @Value("$redis.timeout")rn private Integer timeout;rnrn @Value("$redis.maxIdle")rn private Integer maxIdle;rnrn @Value("$redis.maxTotal")rn private Integer maxTotal;rnrn @Value("$redis.maxWaitMillis")rn private Integer maxWaitMillis;rnrn @Value("$redis.minEvictableIdleTimeMillis")rn private Integer minEvictableIdleTimeMillis;rnrn @Value("$redis.numTestsPerEvictionRun")rn private Integer numTestsPerEvictionRun;rnrn @Value("$redis.timeBetweenEvictionRunsMillis")rn private long timeBetweenEvictionRunsMillis;rnrn @Value("$redis.testOnBorrow")rn private boolean testOnBorrow;rnrn @Value("$redis.testWhileIdle")rn private boolean testWhileIdle;rnrn // @Value("$spring.redis.cluster.nodes")rn // private String clusterNodes;rn //rn // @Value("$spring.redis.cluster.max-redirects")rn // private Integer mmaxRedirectsac;rnrn /**rn * JedisPoolConfig 连接池rn * rn * @returnrn */rn @Beanrn public JedisPoolConfig jedisPoolConfig() rn logger.info("初始化RedisConfig.JedisPoolConfig 连接池====");rn JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();rn // 最大空闲数rn jedisPoolConfig.setMaxIdle(maxIdle);rn // 连接池的最大数据库连接数rn jedisPoolConfig.setMaxTotal(maxTotal);rn // 最大建立连接等待时间rn jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);rn // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)rn jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);rn // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3rn jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);rn // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1rn jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);rn // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个rn jedisPoolConfig.setTestOnBorrow(testOnBorrow);rn // 在空闲时检查有效性, 默认falsern jedisPoolConfig.setTestWhileIdle(testWhileIdle);rn return jedisPoolConfig;rn rnrn /**rn * 单机版配置 @Title: JedisConnectionFactory @param @paramrn * jedisPoolConfig @param @return @return JedisConnectionFactory @autorrn * lpl @date 2018年2月24日 @throwsrn */rn @Beanrn public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig) rn logger.info("初始化RedisConfig.JedisConnectionFactory单机版配置====");rn JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);rn // 连接池rn JedisConnectionFactory.setPoolConfig(jedisPoolConfig);rn // IP地址rn JedisConnectionFactory.setHostName(hostName);rn // 端口号rn JedisConnectionFactory.setPort(port);rn // 如果Redis设置有密码rn JedisConnectionFactory.setPassword(password);rn // 客户端超时时间单位是毫秒rn JedisConnectionFactory.setTimeout(timeout);rn return JedisConnectionFactory;rn rnrn /**rn * 实例化 RedisTemplate 对象rn *rn * @returnrn */rn @Beanrn public RedisTemplate functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) rn RedisTemplate redisTemplate = new RedisTemplate();rn initDomainRedisTemplate(redisTemplate, redisConnectionFactory);rn return redisTemplate;rn rnrn /**rn * 设置数据存入 redis 的序列化方式,并开启事务rn * rn * @param redisTemplatern * @param factoryrn */rn private void initDomainRedisTemplate(RedisTemplate redisTemplate, RedisConnectionFactory factory) rn // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast torn // String!rn redisTemplate.setKeySerializer(new StringRedisSerializer());rn redisTemplate.setHashKeySerializer(new StringRedisSerializer());rn redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());rn redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());rn // 开启事务rn redisTemplate.setEnableTransactionSupport(true);rn redisTemplate.setConnectionFactory(factory);rn rnrn /**rn * 注入封装RedisTemplate @Title: redisUtil @return RedisUtil @autor lpl @datern * 2017年12月21日 @throwsrn */rn @Bean(name = "redisUtil")rn public RedisUtil redisUtil(RedisTemplate redisTemplate) rn RedisUtil redisUtil = new RedisUtil();rn redisUtil.setRedisTemplate(redisTemplate);rn return redisUtil;rn rnrn rn# RedisUtil工具类文件内容如下:rnpackage com.brons.trans.redis;rnimport java.util.List;rnimport java.util.Map;rnimport java.util.Set;rnimport java.util.concurrent.TimeUnit;rnrnimport org.springframework.data.redis.core.RedisTemplate;rnimport org.springframework.util.CollectionUtils;rnrnpublic class RedisUtil rn rn private RedisTemplate redisTemplate; rnrn public void setRedisTemplate(RedisTemplate redisTemplate) rn this.redisTemplate = redisTemplate; rn rn //=============================common============================ rn /** rn * 指定缓存失效时间 rn * @param key 键 rn * @param time 时间(秒) rn * @return rn */ rn public boolean expire(String key,long time) rn try rn if(time>0) rn redisTemplate.expire(key, time, TimeUnit.SECONDS); rn rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 根据key 获取过期时间 rn * @param key 键 不能为null rn * @return 时间(秒) 返回0代表为永久有效 rn */ rn public long getExpire(String key) rn return redisTemplate.getExpire(key,TimeUnit.SECONDS); rn rnrn /** rn * 判断key是否存在 rn * @param key 键 rn * @return true 存在 false不存在 rn */ rn public boolean hasKey(String key) rn try rn return redisTemplate.hasKey(key); rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 删除缓存 rn * @param key 可以传一个值 或多个 rn */ rn @SuppressWarnings("unchecked") rn public void del(String ... key) rn if(key!=null&&key.length>0) rn if(key.length==1) rn redisTemplate.delete(key[0]); rn else rn redisTemplate.delete(CollectionUtils.arrayToList(key)); rn rn rn rnrn //============================String============================= rn /** rn * 普通缓存获取 rn * @param key 键 rn * @return 值 rn */ rn public Object get(String key) rn return key==null?null:redisTemplate.opsForValue().get(key); rn rnrn /** rn * 普通缓存放入 rn * @param key 键 rn * @param value 值 rn * @return true成功 false失败 rn */ rn public boolean set(String key,Object value) rn try rn redisTemplate.opsForValue().set(key, value); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rnrn rnrn /** rn * 普通缓存放入并设置时间 rn * @param key 键 rn * @param value 值 rn * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 rn * @return true成功 false 失败 rn */ rn public boolean set(String key,Object value,long time) rn try rn if(time>0) rn redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); rn else rn set(key, value); rn rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 递增 rn * @param key 键 rn * @param by 要增加几(大于0) rn * @return rn */ rn public long incr(String key, long delta) rn if(delta<0) rn throw new RuntimeException("递增因子必须大于0"); rn rn return redisTemplate.opsForValue().increment(key, delta); rn rnrn /** rn * 递减 rn * @param key 键 rn * @param by 要减少几(小于0) rn * @return rn */ rn public long decr(String key, long delta) rn if(delta<0) rn throw new RuntimeException("递减因子必须大于0"); rn rn return redisTemplate.opsForValue().increment(key, -delta); rn rnrn //================================Map================================= rn /** rn * HashGet rn * @param key 键 不能为null rn * @param item 项 不能为null rn * @return 值 rn */ rn public Object hget(String key,String item) rn return redisTemplate.opsForHash().get(key, item); rn rnrn /** rn * 获取hashKey对应的所有键值 rn * @param key 键 rn * @return 对应的多个键值 rn */ rn public Map hmget(String key) rn return redisTemplate.opsForHash().entries(key); rn rnrn /** rn * HashSet rn * @param key 键 rn * @param map 对应多个键值 rn * @return true 成功 false 失败 rn */ rn public boolean hmset(String key, Map map) rn try rn redisTemplate.opsForHash().putAll(key, map); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * HashSet 并设置时间 rn * @param key 键 rn * @param map 对应多个键值 rn * @param time 时间(秒) rn * @return true成功 false失败 rn */ rn public boolean hmset(String key, Map map, long time) rn try rn redisTemplate.opsForHash().putAll(key, map); rn if(time>0) rn expire(key, time); rn rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 向一张hash表中放入数据,如果不存在将创建 rn * @param key 键 rn * @param item 项 rn * @param value 值 rn * @return true 成功 false失败 rn */ rn public boolean hset(String key,String item,Object value) rn try rn redisTemplate.opsForHash().put(key, item, value); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 向一张hash表中放入数据,如果不存在将创建 rn * @param key 键 rn * @param item 项 rn * @param value 值 rn * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 rn * @return true 成功 false失败 rn */ rn public boolean hset(String key,String item,Object value,long time) rn try rn redisTemplate.opsForHash().put(key, item, value); rn if(time>0) rn expire(key, time); rn rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 删除hash表中的值 rn * @param key 键 不能为null rn * @param item 项 可以使多个 不能为null rn */ rn public void hdel(String key, Object... item) rn redisTemplate.opsForHash().delete(key,item); rn rnrn /** rn * 判断hash表中是否有该项的值 rn * @param key 键 不能为null rn * @param item 项 不能为null rn * @return true 存在 false不存在 rn */ rn public boolean hHasKey(String key, String item) rn return redisTemplate.opsForHash().hasKey(key, item); rn rnrn /** rn * hash递增 如果不存在,就会创建一个 并把新增后的值返回 rn * @param key 键 rn * @param item 项 rn * @param by 要增加几(大于0) rn * @return rn */ rn public double hincr(String key, String item,double by) rn return redisTemplate.opsForHash().increment(key, item, by); rn rnrn /** rn * hash递减 rn * @param key 键 rn * @param item 项 rn * @param by 要减少记(小于0) rn * @return rn */ rn public double hdecr(String key, String item,double by) rn return redisTemplate.opsForHash().increment(key, item,-by); rn rnrn //============================set============================= rn /** rn * 根据key获取Set中的所有值 rn * @param key 键 rn * @return rn */ rn public Set sGet(String key) rn try rn return redisTemplate.opsForSet().members(key); rn catch (Exception e) rn e.printStackTrace(); rn return null; rn rn rnrn /** rn * 根据value从一个set中查询,是否存在 rn * @param key 键 rn * @param value 值 rn * @return true 存在 false不存在 rn */ rn public boolean sHasKey(String key,Object value) rn try rn return redisTemplate.opsForSet().isMember(key, value); rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 将数据放入set缓存 rn * @param key 键 rn * @param values 值 可以是多个 rn * @return 成功个数 rn */ rn public long sSet(String key, Object...values) rn try rn return redisTemplate.opsForSet().add(key, values); rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rnrn /** rn * 将set数据放入缓存 rn * @param key 键 rn * @param time 时间(秒) rn * @param values 值 可以是多个 rn * @return 成功个数 rn */ rn public long sSetAndTime(String key,long time,Object...values) rn try rn Long count = redisTemplate.opsForSet().add(key, values); rn if(time>0) expire(key, time); rn return count; rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rnrn /** rn * 获取set缓存的长度 rn * @param key 键 rn * @return rn */ rn public long sGetSetSize(String key) rn try rn return redisTemplate.opsForSet().size(key); rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rnrn /** rn * 移除值为value的 rn * @param key 键 rn * @param values 值 可以是多个 rn * @return 移除的个数 rn */ rn public long setRemove(String key, Object ...values) rn try rn Long count = redisTemplate.opsForSet().remove(key, values); rn return count; rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rn //===============================list================================= rnrn /** rn * 获取list缓存的内容 rn * @param key 键 rn * @param start 开始 rn * @param end 结束 0 到 -1代表所有值 rn * @return rn */ rn public List lGet(String key,long start, long end) rn try rn return redisTemplate.opsForList().range(key, start, end); rn catch (Exception e) rn e.printStackTrace(); rn return null; rn rn rnrn /** rn * 获取list缓存的长度 rn * @param key 键 rn * @return rn */ rn public long lGetListSize(String key) rn try rn return redisTemplate.opsForList().size(key); rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rnrn /** rn * 通过索引 获取list中的值 rn * @param key 键 rn * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 rn * @return rn */ rn public Object lGetIndex(String key,long index) rn try rn return redisTemplate.opsForList().index(key, index); rn catch (Exception e) rn e.printStackTrace(); rn return null; rn rn rnrn /** rn * 将list放入缓存 rn * @param key 键 rn * @param value 值 rn * @param time 时间(秒) rn * @return rn */ rn public boolean lSet(String key, Object value) rn try rn redisTemplate.opsForList().rightPush(key, value); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 将list放入缓存 rn * @param key 键 rn * @param value 值 rn * @param time 时间(秒) rn * @return rn */ rn public boolean lSet(String key, Object value, long time) rn try rn redisTemplate.opsForList().rightPush(key, value); rn if (time > 0) expire(key, time); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 将list放入缓存 rn * @param key 键 rn * @param value 值 rn * @param time 时间(秒) rn * @return rn */ rn public boolean lSet(String key, List value) rn try rn redisTemplate.opsForList().rightPushAll(key, value); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 将list放入缓存 rn * @param key 键 rn * @param value 值 rn * @param time 时间(秒) rn * @return rn */ rn public boolean lSet(String key, List value, long time) rn try rn redisTemplate.opsForList().rightPushAll(key, value); rn if (time > 0) expire(key, time); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 根据索引修改list中的某条数据 rn * @param key 键 rn * @param index 索引 rn * @param value 值 rn * @return rn */ rn public boolean lUpdateIndex(String key, long index,Object value) rn try rn redisTemplate.opsForList().set(key, index, value); rn return true; rn catch (Exception e) rn e.printStackTrace(); rn return false; rn rn rnrn /** rn * 移除N个值为value rn * @param key 键 rn * @param count 移除多少个 rn * @param value 值 rn * @return 移除的个数 rn */ rn public long lRemove(String key,long count,Object value) rn try rn Long remove = redisTemplate.opsForList().remove(key, count, value); rn return remove; rn catch (Exception e) rn e.printStackTrace(); rn return 0; rn rn rn 问答

没有更多推荐了,返回首页