16

我在 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;
}

提前感谢您的任何回复/见解。另外,这个库有什么官方文档吗?谢谢你 ^_^。

4

3 回答 3

25

根据Booksleeve的作者,

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

于 2011-12-06T08:52:36.897 回答
8

我应该保持这个连接打开,还是应该在每次查询/交易后打开/关闭它(就像我现在所做的那样)?

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

另外,这个库有什么官方文档吗?

我能找到的关于如何使用它的唯一文档是源代码中的测试文件夹

于 2011-09-25T09:42:53.610 回答
4

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

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

你像这样消费它:

RedisConnection connection = Redis.RedisConnectionGateway.Current.GetConnection();
于 2012-02-07T05:29:04.917 回答