복붙노트

[REDIS] 레디 스 메모리 예외 부족하지만, 여전히 충분한 메모리를 가지고

REDIS

레디 스 메모리 예외 부족하지만, 여전히 충분한 메모리를 가지고

나는 우리의 .NET 핵심 C # 프로젝트에서 레디 스와 상호 작용 StackeExchange.Redis 프로젝트를 사용하고 있습니다.

부하가 높을 경우, 우리 레디 스 연결은 다음과 같은 예외와 함께 실패하기 시작합니다 :

StackExchange.Redis.RedisServerException: OOM command not allowed when used memory > 'maxmemory'

문제는 우리가 사용 가능한 메모리 왼쪽의 말도 안되는 금액을 가지고있다. 이 조회하기 쉽고, 그래서 우리는 Elasticache을 사용하고 있습니다 :

우리는 또한 잘 그것과 상호 작용하는 쉘을 통해 Elasticache에 연결하고 메모리 avaialable이 있음을 참조 할 수 있습니다.

이는 연결 정보를 통해 층으로 사용되는 코드의 I입니다.

    public class RedisTimeConnectionManager : IRedisConnectionManager
{
    // More info about the Lazy<> pattern https://stackoverflow.com/questions/28792196/how-does-connectionmultiplexer-deal-with-disconnects
    // Additional information about the multiplexer: https://github.com/StackExchange/StackExchange.Redis/blob/master/docs/Basics.md
    private static Lazy<ConnectionMultiplexer> RedisConnectionMultiplexer = new Lazy<ConnectionMultiplexer>(() =>
    {
        return ConnectionMultiplexer.Connect(ConnectionString);
    });

    private static string ConnectionString { get; set; }

    public RedisTimeConnectionManager(string connectionString)
    {
        ConnectionString = connectionString;
    }

    public ConnectionMultiplexer GetConnectionMultiplexer()
    {
        return RedisConnectionMultiplexer.Value;
    }

    public IDatabase GetDatabaseConnection()
    {
        return RedisConnectionMultiplexer.Value.GetDatabase();
    }
}

그때 나는 내 레디 스 "시간"관리자에게이 연결 층을 전달합니다. 이는 OOM 오류를 던지고 코드입니다 :

public class TimeRedisManager : ITimeRedisManager
{
    private IRedisConnectionManager RedisConnectionManager { get; }

    public TimeRedisManager(IRedisConnectionManager redisConnectionManager)
    {
        RedisConnectionManager = redisConnectionManager;
    }

    public async Task<RedisUserTimelineGetValueDto> GetValueAsync(string id)
    {
        string key = $"time:{id}";

        HashEntry[] entries = await RedisConnectionManager.GetDatabaseConnection().HashGetAllAsync(key);

        // Parse and return values...
    }
}

Elasticache는 이상 7.5GB 사용 가능한 메모리가, 내가 쉘을 통해 상호 작용할 수 있기 때문에, 나는 그것이 어느 StackExchange.Redis 라이브러리 또는 내 코드에서 연결 관리에 문제가있어 있으리라 믿고있어 때문입니다.

.NET CORE 2.1 StackExchange.Redis의 V 2.0.513

마지막으로 중요한 것은 -이 예외가 발생하면, 그것은 일어나고 유지합니다. 레디 스와 상호 작용이 아무것도하지 않는 것을 서비스를 다시 시작. 만 Elasticache 노드가 문제를 해결 다시 시작.

해결법

  1. ==============================

    1.레디 스 2 번에 저장된 데이터에 필요한 메모리 걸릴 수 있습니다.

    레디 스 2 번에 저장된 데이터에 필요한 메모리 걸릴 수 있습니다.

    자세한 내용은 여기 읽기 : https://redis.io/topics/admin

    레디 스에 저장된 데이터에 공간이 8GB 걸리는 경우에 따라서, 부하 레디 스 16 Gbs의 소비된다. 그런 경우 경우 그에 따라 조정 메모리가있을 수 있습니다.

  2. ==============================

    2.오류 메시지에서, 당신의 레디 스 인스턴스는 maxmemory 한계에 도달했습니다.

    오류 메시지에서, 당신의 레디 스 인스턴스는 maxmemory 한계에 도달했습니다.

    maxmemory 그것은 레디 스 사용할 수있는 최대 메모리를 제한하는 레디 스 구성이다. 그래서 당신은 구성 파일에 더 큰 maxmemory을 설정해야합니다.

  3. from https://stackoverflow.com/questions/52993019/redis-out-of-memory-exceptions-but-still-have-plenty-of-memory by cc-by-sa and MIT license