Heim  >  Artikel  >  Datenbank  >  So beheben Sie den Speicherverlustfehler, der durch die Verwendung von Salat zum Starten von Redis verursacht wird

So beheben Sie den Speicherverlustfehler, der durch die Verwendung von Salat zum Starten von Redis verursacht wird

王林
王林nach vorne
2023-05-29 09:01:172361Durchsuche

redis wird mit Salat angezeigt

LEAK: hashedwheelTimer.release() wurde nicht aufgerufen, bevor es in den Garbage Collection aufgenommen wurde. Aktivieren Sie das erweiterte Leck

#🎜🎜 #Speicherleck. Tatsächlich wird es durch unzureichenden Speicher verursacht.

Suchen Sie das Fenster->Einstellungen->Java->Installierte JRE in Eclipse, klicken Sie rechts auf die Schaltfläche Bearbeiten und geben Sie die folgenden Werte in die „Standard-VM-Argumente“ ein. Option in der Bearbeitungsoberfläche Das ist es.

-Xms64m -Xmx128m

Der Speicher kann so eingestellt werden, dass er groß genug ist.

Eine andere Methode kann es nicht lösen. Ich weiß nicht, ob die Methode falsch eingestellt ist

1 Öffnen Sie die Eclipse-Konfigurationsdatei eclipse.ini und ändern Sie -Xmx (der Wert stellt die maximale Speichermenge dar, die der JVM verwenden kann) #🎜 🎜##🎜🎜 #2. Wählen Sie beim Ausführen des Java-Programms Ausführen->Konfiguration ausführen->Argumente aus, geben Sie -Xms100M -Xmx800M ein (-Xms stellt die beim Start des JVM zugewiesene Speichergröße dar und -Xmx stellt das Maximum dar Menge des Speichers, der zugewiesen werden kann). #? wurde in verschiedenen Testumgebungen bereitgestellt, während des Erstellungs- und Bereitstellungsprozesses traten jedoch viele Redis-Probleme auf. Das Projekt basiert auf dem in SpringBoot2.1.12 integrierten JAR-Paket Spring-data-redis-start und verwendet Lettuce als Redis-Verbindungspool.

SpringBoot1.x verwendet standardmäßig Jedis als Redis-Client-Verbindungspool.

SpringBoot2.x, spring-data-redis verwendet standardmäßig Lettuce als Redis-Client-Treiber-Verbindungspool.

2. Fallstrickszenario

Laufumgebung Ein bestimmter Masterknoten im Redis-Cluster ist instabil und kann nicht verbunden werden, was dazu führt, dass die SpringBoot-Anwendung beim Herstellen einer Verbindung zu Redis einen Fehler meldet. und ein Verbindungs-Timeout-Fehler.

3. Lösung

Schreiben Sie die RedisConnectionFactory-Bean basierend auf Spring-data-redis neu. Sie müssen „Überprüfung der Clusterknotenmitgliedschaft abbrechen“ festlegen: .validateClusterNodeMembership(false).

1. Redis-Konfiguration

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. Konfigurationsklasse

@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;
    }
}

Hinweis:

# 🎜🎜#RedisClusterConfiguration getClusterConfiguration() muss ein Passwort festlegen, andernfalls meldet SpringBoot beim Start einen Authentifizierungsfehler:

"io.lettuce.core.RedisCommandExecutionException: NOAUTH-Authentifizierung erforderlich"#🎜 🎜##🎜🎜 #

lautet wie folgt:

Außerdem darf die Version des Salatkernglaspakets nicht zu niedrig sein, um zu vermeiden, dass einige Konfigurationselemente nicht unterstützt werden. Die obige Konfiguration ist Salat -core-5.18.RELEASE.jar.

Das obige ist der detaillierte Inhalt vonSo beheben Sie den Speicherverlustfehler, der durch die Verwendung von Salat zum Starten von Redis verursacht wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen