Как часто мне следует открывать / закрывать соединение с Книжным рукавом? - PullRequest
16 голосов
/ 25 сентября 2011

Я использую библиотеку Booksleeve в приложении C # / ASP.NET 4. В настоящее время объект RedisConnection является статическим объектом в моем классе MonoLink. Должен ли я держать это соединение открытым или я должен открывать / закрывать его после каждого запроса / транзакции (как я делаю сейчас)? Просто немного смущен. Вот как я сейчас использую это:

public static MonoLink CreateMonolink(string URL)
{
    redis.Open();
    var transaction = redis.CreateTransaction();

    string Key = null;

    try
    {
        var IncrementTask = transaction.Strings.Increment(0, "nextmonolink");
        if (!IncrementTask.Wait(5000))
        {
            transaction.Discard();
            throw new System.TimeoutException("Monolink index increment timed out.");
        }

        // Increment complete
        Key = string.Format("monolink:{0}", IncrementTask.Result);

        var AddLinkTask = transaction.Strings.Set(0, Key, URL);
        if (!AddLinkTask.Wait(5000))
        {
            transaction.Discard();
            throw new System.TimeoutException("Add monolink creation timed out.");
        }

        // Run the transaction
        var ExecTransaction = transaction.Execute();
        if (!ExecTransaction.Wait(5000))
        {
            throw new System.TimeoutException("Add monolink transaction timed out.");
        }
    }
    catch (Exception ex)
    {
        transaction.Discard();
        throw ex;
    }
    finally
    {
        redis.Close(false);
    }

    // Link has been added to redis
    MonoLink ml = new MonoLink();
    ml.Key = Key;
    ml.URL = URL;

    return ml;
}

Заранее спасибо за любые ответы / понимание. Кроме того, есть ли какая-либо официальная документация для этой библиотеки? Спасибо тебе. ^ _ ^.

Ответы [ 3 ]

25 голосов
/ 06 декабря 2011

Согласно автору Книжного рукава ,

Соединение является поточно-ориентированным и предназначено для массового использования; не выполняйте соединение для каждой операции.

8 голосов
/ 25 сентября 2011

Должен ли я держать это соединение открытым, или я должен быть открыт / закрыт это после каждого запроса / транзакции (как я сейчас делаю)?

Вероятно, есть небольшие издержки, если вы будете открывать новое соединение каждый раз, когда хотите выполнить запрос / транзакцию, и хотя redis предназначен для высокого уровня одновременно подключенных клиентов, могут возникнуть проблемы с производительностью, если их число составляет около десятков тысяч. Насколько я знаю, пул соединений должен выполняться клиентскими библиотеками (потому что сам redis не имеет этой функциональности), поэтому вы должны проверить, поддерживает ли книжный рукав этот материал. В противном случае вам следует открыть соединение при запуске приложения и оставить его открытым в течение всего срока службы (если по какой-то причине вам не нужны параллельные клиенты, подключенные к redis).

Кроме того, существует ли какая-либо официальная документация для этой библиотеки?

Единственная документация, которую мне удалось найти относительно того, как ее использовать, была папка тестов в ее исходных кодах.

4 голосов
/ 07 февраля 2012

Для справки (продолжение ответа @ bzlm ) я создал Singleton, который всегда предоставляет одно и то же соединение Redis с использованием BookSleeve (если оно закрыто, оно создается. Иначе, существующее соединение обслуживается).

Посмотрите на это: https://stackoverflow.com/a/8777999/290343

Вы потребляете это так:

RedisConnection connection = Redis.RedisConnectionGateway.Current.GetConnection();
...