Redis连接失败本地服务器无法建立连接(redis本地不能连接)
Redis连接失败:本地服务器无法建立连接
最近在开发过程中遇到了一个Redis连接失败的问题,日志中出现了以下信息:本地服务器无法建立连接。
经过排查,发现问题出在Redis连接的配置上。
我检查了Redis服务器的IP和端口号是否正确,以及Redis的运行状态是否正常,确认无误后,我开始检查了本地的Redis连接配置。
一开始我用的是spring-data-redis,其中配置了以下参数:
spring.redis.host=localhost
spring.redis.password=xspring.redis.port=6379
在应用启动时,控制台没有发现异常信息,应用启动成功。然而,当应用进行Redis读写操作时,依旧出现了连接失败的情况。
这时,我想到了可能是Redis客户端版本的问题,于是我升级了Redis客户端版本,也更新了spring-boot-starter-data-redis的版本,但问题还是无法解决。
随后,我开始检查Redis连接池的配置。连接池规定了一些连接池相关的配置参数,例如:
spring.redis.pool.max-active=8
spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0
spring.redis.pool.max-wt=-1ms
当我检查了这些参数之后,很快就找到了问题。由于max-active和max-idle参数的值相同,导致连接池中出现了死锁,从而出现了“本地服务器无法建立连接”的错误。
经过上述排查,我成功解决了Redis连接失败的问题,调整连接池配置参数后,应用可以正常进行Redis读写操作。
总结:
1.检查Redis服务器的IP和端口号,以及Redis的运行状态是否正常;
2.检查Redis客户端版本是否与服务端版本匹配;
3.检查连接池配置参数是否正确,特别是max-active和max-idle参数是否有死锁情况。
代码示例:
1.Redis客户端连接配置:
@Configuration
public 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读写操作:
@Service
public 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); }
}