StackExchange.Redis IDatabase对象应该如何在多线程应用程序中使用?

时间:2016-10-05 22:01:51

标签: c# asp.net redis stackexchange.redis

我从StackExchange.Redis文档中获取有关如何使用IDatabase的混合消息。在Basic Usage doc中它说:

  

从GetDatabase返回的对象是一个廉价的pass-thru对象,不需要存储。

这给人的印象是我应该为每个Redis操作调用GetDatabase。

但是,从Pipelining and Multiplexing doc开始,通过语言和示例代码,您似乎应该重新使用IDatabase对象来利用流水线和多路复用。我说它似乎是这样的,因为示例代码块重用了相同的数据库,因为它讨论了重新使用连接。现在,我不确定 connection 是否引用了GetDatabase或底层连接返回的对象,或者是什么。

我从asp.net Web应用程序访问Redis所以我需要优化我的代码以实现高度多线程访问。我应该为每个操作调用GetDatabase,还是应该由多个线程共享IDatabase对象?如果是后者,到什么程度?是否应该无限期地在整个应用程序中共享一个数据库对象?

1 个答案:

答案 0 :(得分:10)

跨多个线程使用ConnectionMultiplexer。我正在使用.NET Core dependency injection,但您可以使用

static readonly Lazy<ConnectionMultiplexer> SharedMultiplexer => 
    new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect("localhost"));

在特定请求中需要之前调用GetDatabase()

在异步操作中使用内联asyncawait延续方法,以确保优化高度并发访问...

string value = await SharedMultiplexer.GetDatabase().StringGetAsync("mykey");