StackExchange.Redis IDatabase对象应该如何在多线程应用程序中使用?
How should StackExchange.Redis IDatabase object be used in a multi-threaded application?
我从 StackExchange.Redis 文档中获得关于如何使用 IDatabase 的混合信息。在 Basic Usage doc 它说:
The object returned from GetDatabase is a cheap pass-thru object, and does not need to be stored.
这给人的印象是我应该为每个 Redis 操作调用 GetDatabase。
但是,从 Pipelining and Multiplexing doc 的语言和示例代码来看,您似乎应该重新使用 IDatabase 对象以利用流水线和多路复用。我这么说似乎是因为示例代码块重新使用了相同的数据库,并且因为它讨论了重新使用 连接 。现在,我不确定 connection 是指 GetDatabase 返回的对象,还是底层连接,还是什么。
我正在从 asp.net Web 应用程序访问 Redis,因此我需要优化我的代码以实现高度多线程访问。我应该在每个操作中调用 GetDatabase,还是应该由多个线程共享 IDatabase 对象?如果是后者,程度如何?一个数据库对象是否应该无限期地在整个应用程序中共享?
跨多个线程使用ConnectionMultiplexer
。我正在使用 但你可以只使用
static readonly Lazy<ConnectionMultiplexer> SharedMultiplexer =>
new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect("localhost"));
在特定请求中需要之前调用 GetDatabase()
。
在异步操作中使用内联 async
和 await
延续方法以确保针对高并发访问进行优化...
string value = await SharedMultiplexer.GetDatabase().StringGetAsync("mykey");
我从 StackExchange.Redis 文档中获得关于如何使用 IDatabase 的混合信息。在 Basic Usage doc 它说:
The object returned from GetDatabase is a cheap pass-thru object, and does not need to be stored.
这给人的印象是我应该为每个 Redis 操作调用 GetDatabase。
但是,从 Pipelining and Multiplexing doc 的语言和示例代码来看,您似乎应该重新使用 IDatabase 对象以利用流水线和多路复用。我这么说似乎是因为示例代码块重新使用了相同的数据库,并且因为它讨论了重新使用 连接 。现在,我不确定 connection 是指 GetDatabase 返回的对象,还是底层连接,还是什么。
我正在从 asp.net Web 应用程序访问 Redis,因此我需要优化我的代码以实现高度多线程访问。我应该在每个操作中调用 GetDatabase,还是应该由多个线程共享 IDatabase 对象?如果是后者,程度如何?一个数据库对象是否应该无限期地在整个应用程序中共享?
跨多个线程使用ConnectionMultiplexer
。我正在使用
static readonly Lazy<ConnectionMultiplexer> SharedMultiplexer =>
new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect("localhost"));
在特定请求中需要之前调用 GetDatabase()
。
在异步操作中使用内联 async
和 await
延续方法以确保针对高并发访问进行优化...
string value = await SharedMultiplexer.GetDatabase().StringGetAsync("mykey");