【问题标题】:When does APC remove old entries?APC 何时删除旧条目?
【发布时间】:2012-12-16 21:58:13
【问题描述】:

我正在努力寻找 APC 清除其旧条目的方式中的任何逻辑。 尤其是用户条目,我注意到碎片迅速增加到意想不到的水平。

虽然 apc.ttl 和 apc.user_ttl 设置为 3600,但我注意到 APC 缓存中有很多旧条目没有被清除。我反复增加了 APC 的内存大小,但它只会让它在达到 100% 碎片之前持续更长时间。

那么,为什么会发生这种情况?实际上我会认为这是 APC 中的一个错误,它只是不正常的行为。我希望某些 APC 进程不时清除旧条目。

另外,是否可以得出这样的结论:为 PHP 使用另一个缓存系统会更好,并且只使用 APC 作为操作码缓存(缺少清理的问题较少)?

【问题讨论】:

  • 就个人而言,我会为用户数据使用另一种缓存机制,并且只使用 APC 进行操作码缓存 - 我没有遇到任何关于 APC 上的用户数据缓存的问题,而是分布式用户数据缓存,例如 memcache 或 redis在需要时提供可扩展性
  • 所有 APC 函数都有一个 time-to-live 参数,如果您希望在某个时间后删除这些值,您不应该使用它吗?
  • @adeneo 一直都在使用 ttl,但是 1 天前创建的、有效期为 5 分钟的缓存条目现在仍在缓存中。

标签: php garbage-collection apc


【解决方案1】:

如果您想确保删除旧值。您需要明确删除它。

我在我的应用程序中结合使用 APC 和 memcached。 APC 提供操作码缓存以及缓存可能保持不变的本地数据(如配置文件)。所有其他对象都使用某种通读逻辑缓存在 memcached 中。 (如果数据更改则清除)

当我发布新版本时,我重新启动 APC(如果它是一个单独的进程,则通过 apache 或 php)。这将清除 APC 缓存,并且配置文件将在不久后重新加载。如果对象发生了足够大的变化以在加载旧缓存数据时引起问题,我将重新启动 memcached。

【讨论】:

  • memcached 真的会删除过期的项目吗?
  • 是的,memcached 支持 1 秒到 24 小时的过期时间。您将在存储数据时设置您喜欢的过期时间。
  • Memcached 和 APC 删除过期项目。但只有在需要时,也就是没有更多空间可供新条目使用时。那是垃圾收集器。缓存/过期在两者中的工作方式完全相同。主要区别在于 Memcached 不会对内存进行分段。两者的到期时间都可以从 1 秒到几年,而不是 24 小时。
猜你喜欢
  • 1970-01-01
  • 2012-02-01
  • 2010-10-29
  • 2020-05-31
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多