首頁  >  文章  >  資料庫  >  redis使用lettuce啟動導致記憶體洩漏錯誤怎麼解決

redis使用lettuce啟動導致記憶體洩漏錯誤怎麼解決

王林
王林轉載
2023-05-29 09:01:172343瀏覽

redis 使用 lettuce 出現

LEAK: hashedwheelTimer.release() was not called before it's garbage-collected. Enable advanced leak

##記憶記憶體。其實是記憶體不夠大導致。

找到eclispe 中window->preferences->Java->Installed JRE ,點選右側的Edit 按鈕,在編輯介面中的「Default VM Arguments 」選項中,填入下列數值即可。

-Xms64m -Xmx128m

記憶體調的足夠大可解決。

另一種方法無法解決。不知道是不是方法設定不對的問題

1、開啟eclipse設定檔eclipse.ini,更改把-Xmx(其數值代表jvm可以使用的最大記憶體數)

#2. 運行java程式時,選擇run->run configuration->arguments,輸入-Xms100M -Xmx800M(-Xms代表jvm啟動時分配的記憶體大小,-Xmx代表可最大分配多少記憶體)。

#補充:Redis連接池Lettuce踩坑記錄

一、引言

最近,我們頻繁地在不同的測試環境中部署項目,但在搭建和部署過程中遇到了許多Redis的問題。專案是基於SpringBoot2.1.12,SpringBoot2.1.X整合jar包Spring-data-redis-start 使用Lettuce作為Redis連接池。

SpringBoot1.x預設採用Jedis作為redis客戶端連線池。

SpringBoot2.x,spring-data-redis 預設採用Lettuce作為redis客戶端驅動連線池。

二、踩坑場景

運行環境Redis叢集中某個master節點不穩定連線不上,導致SpringBoot應用連線Redis報錯,報錯連線timeout。

三、解決方案

重新編寫 RedisConnectionFactory Bean,基於 Spring-data-redis。需要設定「取消校驗叢集節點的成員關係」:.validateClusterNodeMembership(false)。

1、redis配置

spring:
 redis:
   cluster:
     nodes:
     - ${redis.host.cluster} #redis集群ip-port
   password: ${redis.password}
   timeout: 5000 #连接超时时间
   lettuce:
     pool:
       max-active: 10 #连接池最大连接数
       max-wait: -1 #连接池最大阻塞时间
       max-idle: 5 #连接池中最大空闲连接
       min-idle: 1 #连接池中最小空闲连接
redis:
 cluster:
   enabled: true

2、Config配置類別

@Data
@Component
@ConditionalOnProperty(name = "redis.cluster.enabled", havingValue = "true", matchIfMissing = false)
public class RedisConfig {
    @Autowired
    RedisProperties redisProperties;
    // 在构建LettuceConnectionFactory时,如果不使用内置的destroyMethod,可能会导致Redis连接早于其它Bean被销毁
    @Bean(destroyMethod = "destroy")
    public RedisConnectionFactory newLettuceConnectionFactory() {
        // 配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,Redis集群变更时将会导致连接异常
        ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
                .enablePeriodicRefresh(Duration.ofSeconds(60))// 开启周期刷新(默认60秒)
                .enableAdaptiveRefreshTriggers(RefreshTrigger.ASK_REDIRECT,RefreshTrigger.UNKNOWN_NODE)// 开启自适应刷新
                .build();
        ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
                                 .topologyRefreshOptions(clusterTopologyRefreshOptions)//拓扑刷新
                                 .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                                 .autoReconnect(true)
                                 .socketOptions(SocketOptions.builder().keepAlive(true).build())
                       .validateClusterNodeMembership(false)// 取消校验集群节点的成员关系
                                 .build();
        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .clientOptions(clusterClientOptions)
                                .readFrom(ReadFrom.SLAVE_PREFERRED)
                                .build();
        return new LettuceConnectionFactory(getClusterConfiguration(), clientConfig);
    }
    
    private  RedisClusterConfiguration getClusterConfiguration() {
        RedisProperties.Cluster clusterProperties = redisProperties.getCluster();
        RedisClusterConfiguration config = new RedisClusterConfiguration(clusterProperties.getNodes());
        if (clusterProperties.getMaxRedirects() != null) {
            config.setMaxRedirects(clusterProperties.getMaxRedirects());
        }
        if (redisProperties.getPassword() != null) {
            config.setPassword(RedisPassword.of(redisProperties.getPassword()));
        }
        return config;
    }
}

注意:

RedisClusterConfiguration getClusterConfiguration()需要設定Password ,不然SpringBoot啟動報認證錯誤:

“io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required”

#如下:

####另外,lettuce -core jar包版本不能過低,避免部分配置項目無法支持,以上配置為lettuce-core-5.18.RELEASE.jar。 ###

以上是redis使用lettuce啟動導致記憶體洩漏錯誤怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除