Redis Cache Увеличивается количество подключенных клиентов

Портал Azure - Кэш Redis - Максимальное количество подключенных клиентов

Я разрабатываю приложение с микросервисной архитектурой, в котором я использую Redis Cache для кеширования часто используемой информации. Проблема в том, что количество подключенных клиентов постоянно увеличивается, и я не знаю почему.

Я получаю доступ к Redis Cache из веб-API ASP.NET и веб-задания. Для подключения используется пакет NuGet "StackExchange.Redis" (https://github.com/StackExchange/StackExchange.Redis).

Я подключаюсь к Redis в коде следующим образом:

connection = ConnectionMultiplexer.Connect(configurationOptions);
connection.ConnectionFailed += ConnectionFailed;
connection.ConnectionRestored += ConnectionRestored;
connection.InternalError += InternalError;

if (!connection.IsConnected)
{
    //_traceSource.TraceWarning($"Connection to REDIS '{_endpointAddress}' was not established.");
}

database = connection.GetDatabase();

return database;

Кроме того, я реализовал метод Dispose (), чтобы убедиться, что соединения отключены правильно:

public void Dispose()
{
   connection?.Close(true);
}

person Thomas Hahn    schedule 28.01.2019    source источник
comment
Похоже, ваше приложение создает новые подключения, но не закрывает их   -  person opewix    schedule 28.01.2019
comment
Вы должны использовать один и тот же статический ConnectionMultiplexer   -  person thepirat000    schedule 28.01.2019


Ответы (2)


Реализуйте статический класс Helper следующим образом.

/// <summary>
/// Helper class for connection with Redis Server.
/// </summary>
public static class Helper
{
    /// <summary>
    /// Configuration option to connect with Redis Database.
    /// </summary>
    private static Lazy<ConfigurationOptions> configOptions = new Lazy<ConfigurationOptions>(() =>
    {
        var configOptions = new ConfigurationOptions();
        configOptions.EndPoints.Add("Your Redis sever name");
        configOptions.AbortOnConnectFail = false;
        configOptions.AllowAdmin = true;
        configOptions.KeepAlive = 4;
        configOptions.Password = "Redis server password";
        return configOptions;
    });

    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(configOptions.Value));

    /// <summary>
    /// Connection property to connect Redis Database.
    /// </summary>
    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }
}

После этого используйте его так, где вам это нужно.

var RedisDatabase = Helper.Connection.GetDatabase(Database Number);

Это будет поддерживать соединения автоматически. Надеюсь, это поможет.

person Keyur Ramoliya    schedule 28.01.2019

Я бы сделал следующие 3 шага:

  1. Добавьте ловушку выключения, которая вызывает connection.close ().

    См .: Как вызвать событие перед Environment.Exit ()?

    Но это не всегда будут звонить. Отсюда # 2:

  2. Настройте Redis с тайм-аутом клиента для закрытия соединений в режиме ожидания> некоторого порога https://redis.io/topics/clients

  3. Убедитесь, что дублирующиеся соединения не создаются без надобности. Пример: новое соединение создается при каждом вызове Redis. Ответ @Keyur Ramoliya, кажется, касается этого.

person rainhacker    schedule 29.01.2019