我应该多久打开/关闭一次Booksleeve连接?

时间:2011-09-25 05:01:15

标签: asp.net c#-4.0 redis booksleeve

我在C#/ ASP.NET 4应用程序中使用Booksleeve库。目前,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 个答案:

答案 0 :(得分:25)

According to author of Booksleeve

  

该连接是线程安全的,旨在大规模共享;   每次操作都不要连接。

答案 1 :(得分:8)

  

我应该保持这种联系开放,还是应该打开/关闭   在每次查询/交易之后(正如我现在所做的那样)?

如果每次要进行查询/事务时都打开一个新连接,可能会有一点开销,虽然redis是为高级别并发连接的客户端设计的,但如果它们的数量大约是十几个,可能会出现性能问题成千上万。据我所知,连接池应该由客户端库完成(因为redis本身没有这个功能),所以你应该检查booksleeve supports这个东西。否则,您应该在应用程序启动时打开连接,并在其生命周期内保持打开状态(如果由于某种原因您不需要并行客户端连接到redis)。

  

此外,该库有哪些官方文档?

我能找到的关于如何使用它的唯一文档是tests folder的源代码。

答案 2 :(得分:4)

作为参考(继续@bzlm's answer),我创建了一个Singleton,它始终使用BookSleeve提供相同的Redis连接(如果它已关闭,则正在创建。否则,正在提供现有连接)。

看看这个:https://stackoverflow.com/a/8777999/290343

你就这样消费它:

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