在Memcached中添加与设置


17

我不了解ADD和SET之间的区别有任何线索吗?似乎ADD包含SET或如果存在某些东西且SET只是覆盖,则ADD返回false。谢谢!

编辑:我的特定问题是,“何时使用添加而不是设置或设置而不是添加?”

Answers:


22

您已经很清楚第一个问题的答案:的意图ADD是仅在键不存在时才起作用,而键可以在SET那里更新值,而不管其是否已存在。如果您熟悉SQL,它(大致)就像INSERT查询(ADD)和UPDATESET)之间的区别。

关于您的附录问题,将使用适合您目的的任何一种。我会说这SET是更常见的操作,因为更常见的是您只想说“我希望键foo具有值bar,而我不在乎它是否已经存在”。但是,在某些情况下(不太频繁),有必要知道缓存中还没有密钥。

想到的一个ADD合适的示例是将会话存储在内存缓存中(顺便说一句,我不建议这样做)-如果您随机生成会话ID(或通过哈希生成),则不需要使用与现有会话相同的密钥来创建新会话,因为这将授予一个用户访问另一用户数据的权限。在这种情况下,创建会话时,将使用ADD,如果会话返回失败状态,则需要生成一个新的会话ID,然后重试。当然,更新会话将SET在用户浏览应用程序时使用。


1
我在这里可能有点挑剔,但是在与SQL的比较中,如果“ add”与INSERT进行比较,则“ set”将与REPLACE而不是UPDATE进行比较。
matteo 2015年

2
因此,使用“大致”一词。如果您真的想挑剔,REPLACE甚至还不是SQL ...那是“ MySQL能够从SQL松散地激发出来的语言”(笑)
womble

3

除了上述用户ID'womble'的答案外,还请考虑以下几点:

  1. 带有“设置”而不是“添加” 的竞争条件的可能性。参见以下链接至尼克·约翰逊的答案:https : //stackoverflow.com/questions/13234556/using-memcache-add-instead-of-set

  2. 如果您知道“添加”可以,请不要使用“设置”。这是为了避免通过网络发送数据,因为这些是RPC调用。几乎所有时间都被网络流量消耗,而不是在内存缓存中寻找键值对。因此,如果您可以避免最好的网络流量,那么在这种情况下,您的响应时间将会更快。


请参阅Appstats(https://developers.google.com/appengine/docs/python/tools/appstats(由Google提供)),并进一步了解上述第2点,请观看http://www.youtube.com/watch Guido Van Rossum(@Google)的?v = bvp7CuBWVgA

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.