在Memcached中添加vs设置

我不明白ADD和SET之间的区别吗? 看起来好像ADD包含SET,或者如果有东西存在,那么ADD返回false,而SET只是覆盖。 谢谢!

编辑:我的具体问题是,“你什么时候使用添加而不是设置或设置,而不是添加?

你几乎已经得到了你的第一个问题的答案: ADD的意图是只有当一个键还不存在,而SET在那里更新值,不pipe它是否已经存在。 如果您熟悉SQL,则(大致)像INSERT查询( ADD )和UPDATESET )之间的区别。

关于您的附录问题,您可以使用符合您的目的的任何一个。 我会说SET将是更常见的操作,因为更常见的是你只想说“我想要关键的foo有价值bar ,我不在乎它是否已经在那里了”。 然而,当需要知道一个密钥不在caching中时,会有(不太频繁的)情况。

ADD适当的时候,想到的一个例子是将会话存储在memcache中(顺便说一下,我不build议这样做) – 如果你随机地(或通过散列)生成会话ID,希望使用与现有密钥相同的密钥创build一个新的会话,因为这将授予一个用户访问其他用户的数据的权限。 在这种情况下,创build会话时,您将使用ADD ,如果返回失败状态,则需要生成新的会话ID并重试。 当然,更新会话会在用户通过应用程序工作时使用SET

除了上面的用户id“womble”的答案,请考虑以下几点:

  1. “设置”与“添加”相对的竞争条件的可能性。 见下面的链接到尼克约翰逊的答案: https : //stackoverflow.com/questions/13234556/using-memcache-add-instead-of-set

  2. 如果你知道'add'会做,那么不要使用'set'。 这是为了避免通过networking发送数据,因为这些是RPC调用 。 实际上几乎所有的时间都被networkingstream量所占用,而不是在memcache中查找键值对。 因此,如果您可以避免最好的networkingstream量,那么您的响应时间会更快。


请参阅Appstats( https://developers.google.com/appengine/docs/python/tools/appstats (by Google))并了解更多的第2点,请观看http://www.youtube.com/watch ?v = bvp7CuBWVgA Guido Van Rossum(@Google)