zoukankan      html  css  js  c++  java
  • org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 300 millisecond(s)

    原因:

    1、测试连接超时导致;

    解决办法:修改spring中配置文件 spring.redis.timeout=800  ,调大超时时间

    同时引入了lettuce和jedis的依赖导致的,项目中排出jedis的依赖并加入apache的

    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.7.0</version>
    </dependency>

    修改:

    1、

    redis异常:

    [2020-06-07 09:54:40.339][pool-8-thread-64][ERROR][com.sms.proxyee.ippool.schedule.ChannelRegisterIpTask][93]:
    org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 300 millisecond(s)
    at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:70) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:269) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.lettuce.LettuceZSetCommands.convertLettuceAccessException(LettuceZSetCommands.java:906) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.lettuce.LettuceZSetCommands.zAdd(LettuceZSetCommands.java:99) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.DefaultedRedisConnection.zAdd(DefaultedRedisConnection.java:808) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.connection.DefaultStringRedisConnection.zAdd(DefaultStringRedisConnection.java:1328) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.core.DefaultZSetOperations.lambda$add$1(DefaultZSetOperations.java:65) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:228) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:188) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.redis.core.DefaultZSetOperations.add(DefaultZSetOperations.java:65) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at com.sms.proxyee.ippool.service.IpPoolService.registerIps(IpPoolService.java:73) ~[classes/:?]
    at com.sms.proxyee.ippool.schedule.ChannelRegisterIpTask.lambda$null$0(ChannelRegisterIpTask.java:89) ~[classes/:?]
    at java.util.HashMap.forEach(HashMap.java:1289) ~[?:1.8.0_211]
    at com.sms.proxyee.ippool.schedule.ChannelRegisterIpTask.lambda$run1$1(ChannelRegisterIpTask.java:88) ~[classes/:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_211]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_211]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211]
    Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 300 millisecond(s)
    at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:114) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) ~[lettuce-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at com.sun.proxy.$Proxy105.zadd(Unknown Source) ~[?:?]
    at org.springframework.data.redis.connection.lettuce.LettuceZSetCommands.zAdd(LettuceZSetCommands.java:97) ~[spring-data-redis-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    ... 14 more

    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.AutoConfigureAfter;
    import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.connection.RedisPassword;
    import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
    import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import java.time.Duration;
    
    @Configuration
    @AutoConfigureAfter(RedisAutoConfiguration.class)
    public class LettuceConfiguration {
        @Autowired
        private RedisConfig redisConfig;
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    
    
        @Bean
    //    @Deprecated
        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            return new StringRedisTemplate(redisConnectionFactory);
        }
    
        @Bean
        LettuceConnectionFactory lettuceConnectionFactory(GenericObjectPoolConfig genericObjectPoolConfig) {
            // 单机版配置
            RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
            redisStandaloneConfiguration.setDatabase(redisConfig.getDatabase());
            redisStandaloneConfiguration.setHostName(redisConfig.getHost());
            redisStandaloneConfiguration.setPort(redisConfig.getPort());
            redisStandaloneConfiguration.setPassword(RedisPassword.of(redisConfig.getPassword()));
    
            // 集群版配置
    //        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
    //        String[] serverArray = clusterNodes.split(",");
    //        Set<RedisNode> nodes = new HashSet<RedisNode>();
    //        for (String ipPort : serverArray) {
    //            String[] ipAndPort = ipPort.split(":");
    //            nodes.add(new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1])));
    //        }
    //        redisClusterConfiguration.setPassword(RedisPassword.of(password));
    //        redisClusterConfiguration.setClusterNodes(nodes);
    //        redisClusterConfiguration.setMaxRedirects(maxRedirects);
    
            LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                    .commandTimeout(Duration.ofMillis(redisConfig.getTimeout()))
                    .poolConfig(genericObjectPoolConfig)
                    .build();
            return new LettuceConnectionFactory(redisStandaloneConfiguration,clientConfig);
        }
    
    
        /**
         * GenericObjectPoolConfig 连接池配置
         *
         * @return
         */
        @Bean
        public GenericObjectPoolConfig genericObjectPoolConfig() {
            GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
            genericObjectPoolConfig.setMaxIdle(redisConfig.getMaxIdle());
            genericObjectPoolConfig.setMinIdle(redisConfig.getMinIdle());
            genericObjectPoolConfig.setMaxTotal(redisConfig.getMaxActive());
            genericObjectPoolConfig.setMaxWaitMillis(redisConfig.getMaxWait());
            return genericObjectPoolConfig;
        }
    }
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    /**
     * 生菜redis配置
     */
    @Data
    @Component
    @ConfigurationProperties(prefix="spring.redis")
    public class RedisConfig {
        private String host;
        private int port;
        private String password;
        private int database;
        private int maxIdle;
        private int minIdle;
        private int maxActive;
        private long maxWait;
        private long timeout;
    
    }
    ##### database config #####
    ##### redis config #####
    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379
    # 连接超时时间(毫秒)
    # Redis服务器连接密码(默认为空)
    spring.redis.password=test
    #测试环境网络差调大
    spring.redis.timeout=300
    ##连接池最大连接数(使用负值表示没有限制) 默认8
    spring.redis.max-active=500
    ## 连接池中的最大空闲连接 默认8
    spring.redis.max-idle=8
    ## 连接池中的最小空闲连接 默认0
    spring.redis.min-idle=0
    ## 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    spring.redis.max-wait=-1
  • 相关阅读:
    中国首届React开发者大会 8月18日 广州举行
    事件循环:Flutter 中代码是如何执行和运行的
    大前端趋势所向:这么多跨端技术,为什么选择 Flutter?
    通往大前端的一把关键钥匙 Flutter
    如何选一部好的手机?性价比高的智能手机推荐,2020智能手机排行榜!
    智能手机边充电边玩对电池有什么损害吗?
    你的智能手机究竟能用多久?
    新型添加技术
    智能手机
    姐姐不愧是姐姐,快看《乘风破浪的姐姐》
  • 原文地址:https://www.cnblogs.com/zhangshiwen/p/13059276.html
Copyright © 2011-2022 走看看