Я использую проект StackeExchange.Redis для взаимодействия с Redis в нашем проекте .NET Core C #.
При большой нагрузке наши подключения Redis перестают работать со следующимиисключение:
StackExchange.Redis.RedisServerException: OOM command not allowed when used memory > 'maxmemory'
Проблема в том, что у нас остаётся нелепое количество свободной памяти.Мы используем Elasticache, поэтому его легко найти:
Мы также можем подключиться к Elasticache через оболочку и посмотреть, что память доступна.и взаимодействовать с ним просто отлично.
Это код, который я использовал в качестве слоя над информацией о Соединении.
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();
}
}
Затем я передаю этот уровень Соединения своему менеджеру redis "time",Это код, который выдает ошибку 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,5 ГБ свободной памяти, и поскольку я могу взаимодействовать с ним через оболочку, я предполагаю, что это либо StackExchange.Библиотека Redis, или проблема с управлением соединениями в моем коде.
.NET CORE 2.1 StackExchange.Redis v 2.0.513
Еще одна важная вещь - когда это исключениеслучается, это продолжаетсяПерезапуск сервисов, которые взаимодействуют с Redis, ничего не делает.Только перезапуск узлов Elasticache решает проблему.