当 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 时会保留整个内存,因此无论是否需要,它总是分配全部内存