Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk menyelesaikan ralat kebocoran memori yang disebabkan oleh menggunakan salad untuk memulakan redis

Bagaimana untuk menyelesaikan ralat kebocoran memori yang disebabkan oleh menggunakan salad untuk memulakan redis

王林
王林ke hadapan
2023-05-29 09:01:172344semak imbas

Redis menggunakan salad

LEAK: hashedwheelTimer.release() tidak dipanggil sebelum ia dikumpul oleh sampah. Malah, ia disebabkan oleh ingatan yang tidak mencukupi.

Cari tetingkap->preferences->Java->JRE yang dipasang dalam eclispe, klik butang Edit di sebelah kanan dan isikan nilai berikut dalam pilihan "Default VM Arguments" dalam antara muka penyuntingan.

Ia boleh diselesaikan dengan melaraskan memori supaya cukup besar. -Xms64m -Xmx128m

Cara lain tidak berkesan. Saya tidak tahu sama ada kaedah ditetapkan dengan salah

1 Buka fail konfigurasi Eclipse.ini dan tukar -Xmx (nilai mewakili jumlah maksimum memori yang boleh digunakan oleh jvm)

<.>2. Run Apabila menggunakan program java, pilih run->run configuration->arguments dan masukkan -Xms100M -Xmx800M (-Xms mewakili saiz memori yang diperuntukkan apabila jvm bermula, dan -Xmx mewakili jumlah maksimum memori yang boleh diperuntukkan).

Tambahan: Redis connection pool Lettuce pitfall record

1 PengenalanBaru-baru ini, kami kerap menggunakan projek dalam persekitaran ujian yang berbeza Masalah Redis dihadapi semasa proses pembinaan dan penempatan. Projek ini berdasarkan SpringBoot2.1.12. Pakej balang bersepadu SpringBoot2.1.X Spring-data-redis-start menggunakan Lettuce sebagai kumpulan sambungan Redis.

SpringBoot1.x menggunakan Jedis sebagai kumpulan sambungan klien redis secara lalai.

SpringBoot2.x, spring-data-redis menggunakan Lettuce sebagai kumpulan sambungan pemacu klien redis secara lalai.

2. Senario perangkap

Nod induk tertentu dalam persekitaran berjalan gugusan Redis tidak stabil dan tidak boleh disambungkan, menyebabkan aplikasi SpringBoot melaporkan ralat semasa menyambung ke Redis dan ralat tamat masa sambungan .

3. Penyelesaian

Tulis semula RedisConnectionFactory Bean, berdasarkan Spring-data-redis. Anda perlu menetapkan "Batalkan pengesahan keahlian nod kluster": .validateClusterNodeMembership(false).

1. konfigurasi 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. Kelas konfigurasi 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;
    }
}

Nota:

RedisClusterConfiguration getClusterConfiguration() perlu Kata laluan , jika tidak SpringBoot bermula dan melaporkan ralat pengesahan:

"io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication diperlukan"

seperti berikut:

Selain itu, salad -Versi pakej balang teras tidak boleh terlalu rendah untuk menghalang beberapa item konfigurasi daripada disokong Konfigurasi di atas ialah lettuce-core-5.18.RELEASE.jar.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat kebocoran memori yang disebabkan oleh menggunakan salad untuk memulakan redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam