防止与memcached的连接过多(Enyim Client)

时间:2011-04-28 16:42:33

标签: .net performance memcached scalability enyim

我正在寻找有关处理打开memcached连接的有效解决方案的建议,请参阅常见问题解答引用:

  

记住没有什么可以阻止你   偶然连接很多次。如果   您实例化一个memcached客户端   对象作为你对象的一部分   试图存储,不要感到惊讶   当一个请求中有1,000个对象时   创建1,000个并行连接。   仔细查看这样的bug   在跳到列表之前。

另请参阅:Initializing a Memcached ClientManaging Connection Objects

我考虑在缓存程序集中使用单例来提供memcached客户端,但我确信必须有更好的方法,因为锁会引入(不需要?)开销。

我很清楚客户端的使用模式,我不清楚的是如何在可扩展性和性能方面有效地使用客户端。其他人如何处理使用memcached客户端?

为你提供50美元的赏金。

1 个答案:

答案 0 :(得分:3)

我们在redis客户端上遇到了类似的情况,最初我们的解决方案是拥有一个通用的单个实例,我们通过lock同步访问。这很好,但为了避免延迟和阻塞,我们最终编写了一个线程安全的流水线客户端,它允许并发使用而不会阻塞。我不太了解男士的协议,但我想知道类似的东西是否适用于此。我真的很想尝试调查,看看我是否可以将它添加到BookSleeve(我们的自定义OSS redis客户端),如果你可以等一会儿。

但我们通常只能继续使用同步的共享实例(与单例几乎相同,具体取决于你的纯粹程度)。


瞥见the FAQ,管道确实是可能的;我完全愿意在booksleeve内编写一个异步/流水线memcached客户端。大多数原始IO /多路复用在redis中都很常见。您可以考虑的其他技巧是使用get_multi等而不是尽可能单独获取 - 我不知道您当前的客户端是否支持此功能(IK尚未查看)。

但是:我不知道如何将memcached与redis进行对比,但在我们的情况下 ,切换到流水线/多路复用API意味着我们不需要来使用多个池(许多连接) - 单个连接(正确的流水线)能够支持单个节点的大量并发使用。