【问题标题】:How is data replaced in memcached when it is full, and memcache performance?memcached 满时如何替换数据,memcache 性能如何?
【发布时间】:2012-06-28 15:43:04
【问题描述】:

来自 memcached wiki:

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

我有以下问题:

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

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

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

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

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

【问题讨论】:

  • LRU 代表最近最少使用...如果 memcache wiki 这么说,那么我认为是这种情况,除非您有证据表明其他情况
  • 说实话,听起来你要么想太多,要么 memcached 不是你想要的。 memchached 是一个缓存,目的是让经常使用的数据快速可用,否则可能需要一些时间来加载。它绝对不保证这些数据每次都可用,或持续多长时间,或根本不可用。它不是主数据存储。它所做的只是也许有时会加快数据的检索速度。您永远不能假设某些数据会在缓存中。这就是缓存的本质。
  • 最需要强调的一点是memcached提供的是cache服务,而不是有保证的数据存储。它旨在支持配置约束内的多个应用程序。如果被任何单个应用滥用,那么共享该缓存的所有应用都会受到影响。

标签: php performance memcached


【解决方案1】:

当memcached需要在内存中存储新数据,而内存已经满了,是这样的:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-22
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2015-04-09
    相关资源
    最近更新 更多