9

从 memcached 维基:

当表已满时,后续插入会导致按最近最少使用 (LRU) 顺序清除较旧的数据。

我有以下问题:

  1. 哪些数据将被清除?插入较旧的那个,还是最近最少使用的那个?我的意思是,如果最近访问的数据是d1最旧的插入数据,并且缓存已满,同时替换数据会被替换d1吗?

  2. 我正在使用 PHP 与 memcached 交互。我可以控制如何在 memcached 中替换数据吗?就像我不希望我的一些数据在过期之前被替换,即使缓存已满。不应替换此数据,而是可以删除其他数据以进行插入。

  3. 数据过期后是否立即删除?

  4. 存储的键数量对 memcached 性能有什么影响?

  5. -koption in的意义是什么memcached.conf?我无法理解“锁定所有分页内存”是什么意思。此外,README 中的描述是不够的。

4

1 回答 1

16

当 memcached 需要在内存中存储新数据,而内存已经满时,会发生这样的情况:

  • memcached 搜索一个合适的*过期条目,如果找到,它将替换该条目中的数据。哪个回答了第 3 点)数据不会立即删除,但是当应该设置新数据时,会重新分配空间
  • 如果没有找到过期的条目,则替换最近最少使用的条目

*请记住 memcached 是如何处理内存的:它分配不同大小的块,因此您要在缓存中设置的数据大小在决定删除哪个条目时发挥作用。条目为 2K、4K、8K、16K 等,最大尺寸为 1M。

所有这些信息都可以在文档中找到,因此请仔细阅读。正如@deceze 所说,memcached 不保证数据将在内存中可用,您必须为缓存未命中风暴做好准备。避免错过风暴的一种有趣方法是使用一些随机偏移设置过期时间,例如 10 + [0..10] 分钟,这意味着一些项目将存储 10 分钟,而其他项目将存储 20 分钟(目标是并非所有项目同时过期)。

如果你想在缓存中保留一些东西,你必须做两件事:

  • 一个预热脚本,它要求缓存加载数据。所以它总是最近使用
  • 物品的 2 个过期时间:一个真实的过期时间,比如说 30 分钟;另一个 - 与项目一起缓存 - 逻辑到期时间,比方说 10 分钟。当您从缓存中检索数据时,您会检查逻辑过期时间以及是否过期 - 重新加载数据并将其在缓存中再设置 30 分钟。这样你就永远不会碰到真正的缓存过期时间,并且数据会定期刷新。

5)“memcached.conf”中的-k选项有什么意义。我无法理解“锁定所有分页内存”是什么意思。README 中的描述也是不够的。

无论您为 memcached 分配多少内存,它都只会使用它需要的数量,例如,它只分配实际使用的内存。但是,使用该-k选项,在启动 memcached 时会保留整个内存,因此无论是否需要,它总是分配全部内存

于 2012-06-27T10:15:33.217 回答