Redis连接失败:本地服务器无法建立连接
最近在开发过程中遇到了一个Redis连接失败的问题,日志中出现了以下信息:本地服务器无法建立连接。
经过排查,发现问题出在Redis连接的配置上。
我检查了Redis服务器的IP和端口号是否正确,以及Redis的运行状态是否正常,确认无误后,我开始检查了本地的Redis连接配置。
一开始我用的是spring-data-redis,其中配置了以下参数:
spring.redis.host=localhostspring.redis.password=xxxxspring.redis.port=6379
在应用启动时,控制台没有发现异常信息,应用启动成功。然而,当应用进行Redis读写操作时,依旧出现了连接失败的情况。
这时,我想到了可能是Redis客户端版本的问题,于是我升级了Redis客户端版本,也更新了spring-boot-starter-data-redis的版本,但问题还是无法解决。
随后,我开始检查Redis连接池的配置。连接池规定了一些连接池相关的配置参数,例如:
spring.redis.pool.max-active=8spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-wt=-1ms
当我检查了这些参数之后,很快就找到了问题。由于max-active和max-idle参数的值相同,导致连接池中出现了死锁,从而出现了“本地服务器无法建立连接”的错误。
经过上述排查,我成功解决了Redis连接失败的问题,调整连接池配置参数后,应用可以正常进行Redis读写操作。
总结:
1.检查Redis服务器的IP和端口号,以及Redis的运行状态是否正常;
2.检查Redis客户端版本是否与服务端版本匹配;
3.检查连接池配置参数是否正确,特别是max-active和max-idle参数是否有死锁情况。
代码示例:
1.Redis客户端连接配置:
@Configurationpublic class RedisConfig { @Value("${spring.redis.host}") private String hostName; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.timeout}") private int timeout; @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } @Bean public RedisConnectionFactory redisConnectionFactory() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(8); poolConfig.setMaxTotal(8); poolConfig.setMinIdle(0); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(poolConfig); jedisConnectionFactory.setHostName(hostName); jedisConnectionFactory.setPassword(password); jedisConnectionFactory.setPort(port); jedisConnectionFactory.setTimeout(timeout); return jedisConnectionFactory; }}
2.使用RedisTemplate读写操作:
@Servicepublic class RedisServiceImpl implements RedisService { @Autowired private RedisTemplate redisTemplate; @Override public void set(String key, Object value, long time) { ValueOperations operations = redisTemplate.opsForValue(); operations.set(key, value, time, TimeUnit.SECONDS); } @Override public Object get(String key) { ValueOperations operations = redisTemplate.opsForValue(); return operations.get(key); } @Override public boolean delete(String key) { return redisTemplate.delete(key); } @Override public boolean hasKey(String key) { return redisTemplate.hasKey(key); }}
香港服务器首选,2H2G首月10元开通。()提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。