>  기사  >  데이터 베이스  >  Lettuce를 사용하여 Redis를 시작할 때 발생하는 메모리 누수 오류를 해결하는 방법

Lettuce를 사용하여 Redis를 시작할 때 발생하는 메모리 누수 오류를 해결하는 방법

王林
王林앞으로
2023-05-29 09:01:172344검색

Redis는 양상추를 사용합니다.

LEAK: hasedwheelTimer.release()가 가비지 수집되기 전에 호출되지 않았습니다. 고급 누출을 활성화합니다.

메모리 누출. 실제로 메모리 부족으로 인해 발생합니다.

eclispe에서 window->preferences->Java->Installed JRE를 찾아 오른쪽에 있는 Edit 버튼을 클릭하고 편집 인터페이스의 "Default VM Arguments" 옵션에 다음 값을 입력하세요.

-Xms64m -Xmx128m

메모리는 충분히 크게 조정할 수 있습니다.

다른 방법은 작동하지 않습니다. 잘못된 메소드 설정으로 인한 문제인지는 모르겠습니다

1. Eclipse 구성 파일 eclipse.ini를 열고 -Xmx를 변경합니다(값은 jvm이 사용할 수 있는 최대 메모리 양을 나타냅니다)

2. Java 프로그램에서 실행->구성 실행->인수를 선택하고 -Xms100M -Xmx800M을 입력합니다(-Xms는 jvm이 시작될 때 할당되는 메모리 크기를 나타내고, -Xmx는 할당할 수 있는 최대 메모리 양을 나타냅니다).

보충: Redis 연결 풀 상추 함정 기록

1. 소개

최근 다양한 테스트 환경에서 프로젝트를 자주 배포했지만 구축 및 배포 과정에서 많은 Redis 문제에 직면했습니다. 이 프로젝트는 SpringBoot2.1.12를 기반으로 합니다. SpringBoot2.1.X 통합 jar 패키지 Spring-data-redis-start는 Lettuce를 Redis 연결 풀로 사용합니다.

SpringBoot1.x는 기본적으로 Jedis를 Redis 클라이언트 연결 풀로 사용합니다.

SpringBoot2.x, spring-data-redis는 기본적으로 Redis 클라이언트 드라이버 연결 풀로 Lettuce를 사용합니다.

2. 함정 시나리오

실행 중인 Redis 클러스터의 마스터 노드가 불안정하여 연결할 수 없어 SpringBoot 애플리케이션이 Redis에 연결할 때 오류와 연결 시간 초과 오류를 보고합니다.

3. 솔루션

Spring-data-redis를 기반으로 RedisConnectionFactory Bean을 다시 작성합니다. "클러스터 노드 멤버십 확인 취소"를 설정해야 합니다: .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()은 비밀번호를 설정해야 합니다. 그렇지 않으면 SpringBoot가 시작할 때 인증 오류를 보고합니다.

"io.lettuce. core.RedisCommandExecut ionException: NOAUTH 인증 필요”

는 다음과 같습니다.

또한 lettuce-core jar 패키지 버전이 너무 낮아서 일부 구성 항목이 지원되지 않을 수 없습니다. 위 구성은 lettuce-core-5.18입니다. .RELEASE.jar.

위 내용은 Lettuce를 사용하여 Redis를 시작할 때 발생하는 메모리 누수 오류를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제