[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.레디 스 2 번에 저장된 데이터에 필요한 메모리 걸릴 수 있습니다.
레디 스 2 번에 저장된 데이터에 필요한 메모리 걸릴 수 있습니다.
자세한 내용은 여기 읽기 : https://redis.io/topics/admin
레디 스에 저장된 데이터에 공간이 8GB 걸리는 경우에 따라서, 부하 레디 스 16 Gbs의 소비된다. 그런 경우 경우 그에 따라 조정 메모리가있을 수 있습니다.
-
==============================
2.오류 메시지에서, 당신의 레디 스 인스턴스는 maxmemory 한계에 도달했습니다.
오류 메시지에서, 당신의 레디 스 인스턴스는 maxmemory 한계에 도달했습니다.
maxmemory 그것은 레디 스 사용할 수있는 최대 메모리를 제한하는 레디 스 구성이다. 그래서 당신은 구성 파일에 더 큰 maxmemory을 설정해야합니다.
from https://stackoverflow.com/questions/52993019/redis-out-of-memory-exceptions-but-still-have-plenty-of-memory by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 그것은 레디 스에 저장 세션에 얼마나 안전합니까? (0) | 2020.01.03 |
---|---|
[REDIS] Node.js를, Socket.io, 레디 스 펍 / 서브 높은 볼륨, 낮은 지연 시간의 어려움 (0) | 2020.01.03 |
[REDIS] 레디 스에서 중첩 된 구조의 대안? (0) | 2020.01.03 |
[REDIS] 레디 스 지연에서 루프 가져 오기 항목의 경우 (0) | 2020.01.03 |
[REDIS] 효율적인 방법은 세트 구성원 업데이트를 레디 스 (0) | 2020.01.03 |