为什么memcached不支持“多组”

时间:2010-07-21 18:28:43

标签: memcached

任何人都可以解释为什么memcached的人决定支持多次获取而不是多次设置。 通过multi我的意思是涉及多个键的操作(参见http://code.google.com/p/memcached/wiki/NewCommands处的协议)。

因此,您可以一次性获得多个按键(基本优势是通过减少往返次数获得的标准节省)但为什么不能获得批量设置?

我的理论是,它意味着减少数量的集合并且过于单独地(例如,在高速缓存读取和未命中时)。但我仍然没有看到多集真正与memcached的一般哲学发生冲突。

我查看了http://code.google.com/p/memcached/wiki/NewCommonFeatures处的客户端功能,似乎有些客户端可能支持“Multi-Set”(为什么只有二进制协议?)。我正在使用Java spy memcached,顺便说一句。

3 个答案:

答案 0 :(得分:1)

我对memcache内部结构知之甚少,但我认为写入必须是阻塞,原子操作。我假设允许对多个集合操作进行批处理,您可以长时间阻止所有读取(或者在仅应用了一半写入的情况下冒险发生)。强制写入单独完成允许它们与gets相当交错。

答案 1 :(得分:1)

它在文本协议中不受支持,因为它表达起来非常非常复杂,没有客户端会支持它,并且它提供的功能很少,你不能从文本协议中做到这一点。

二进制协议支持它,因为它是二进制操作的一个简单用例。

spymemcached隐式支持它 - 只需做一堆设置就可以实现魔术:

http://dustin.github.com/2009/09/23/spymemcached-optimizations.html

答案 2 :(得分:0)

我认为限制使用多集是为了避免在将缓存值写入内存缓存时发生冲突。

作为对象缓存,我无法预见何时需要事务类型写入的示例。这个用例似乎不太适合缓存层,但更适合底层数据库。

如果集合来自不同的客户端,则最有可能的情况是,对于一个密钥,最后一个密钥获胜,或者至少足够接近,直到缓存失效并写入更新的值。

正如Gian所提到的,当缓存中有几次或多次写入时,似乎没有任何理由阻止从缓存中读取。