![Memcached 中的添加与设置](https://linux22.com/image/555825/Memcached%20%E4%B8%AD%E7%9A%84%E6%B7%BB%E5%8A%A0%E4%B8%8E%E8%AE%BE%E7%BD%AE.png)
我不明白 ADD 和 SET 之间的区别。有什么线索吗?似乎 ADD 包含 SET,或者如果存在某些内容,则 ADD 返回 false,而 SET 只是覆盖。谢谢!
编辑:我的具体问题是,“什么时候使用 add 而不是 set 或 set 而不是 add?”
答案1
您已经基本知道第一个问题的答案了: 的目的ADD
是仅在键不存在时才起作用,而的目的是更新值,无论它是否已经存在。如果您熟悉 SQL,它(大致)就像查询 ( ) 和( )SET
之间的区别。INSERT
ADD
UPDATE
SET
关于您的附录问题,您可以使用适合您目的的任何一种。我想说这SET
将是更常见的操作,因为更常见的是,您只想说“我希望键foo
具有值bar
,而我不在乎它是否已经在那里”。但是,在某些情况下(不太常见),需要知道某个键是否已在缓存中。
我想到的一个ADD
合适的例子是将会话存储在 memcache 中(顺便说一句,我不推荐这样做)——如果您随机生成会话 ID(或通过哈希),您不会想使用与现有会话相同的密钥创建新会话,因为这将授予一个用户访问另一个用户数据的权限。在这种情况下,当您创建会话时,您将使用ADD
,如果它返回失败状态,您将需要生成一个新的会话 ID 并重试。当然,SET
当用户浏览您的应用程序时,更新会话将使用。
答案2
除了用户 ID 为“womble”的上述答案之外,还请考虑以下几点:
可能性竞争条件使用 'set' 而不是 'add'。请参阅以下 Nick Johnson 的回答链接:https://stackoverflow.com/questions/13234556/using-memcache-add-instead-of-set
如果你知道“add”就可以了,那么就不要使用“set”。这是避免通过网络发送数据,因为这些是 RPC 调用。实际上,几乎所有时间都花在了网络流量上,而不是在内存缓存中查找键值对。因此,如果您可以避免网络流量,那是最好的,因为在这种情况下您的响应时间会更快。
查看 Appstats (https://developers.google.com/appengine/docs/python/tools/appstats(由 Google 提供)若要进一步了解上述第 2 点,请观看http://www.youtube.com/watch?v=bvp7CuBWVgA作者:Guido Van Rossum(@Google)