【问题标题】:Cache design and Memcache(d) records with timeouts?缓存设计和 Memcache(d) 记录超时?
【发布时间】:2012-05-24 09:42:48
【问题描述】:

对于每个 API 调用,我都有一个非常广泛的缓存系统。每个命令和请求参数以及特定的超时都会创建唯一的指纹。

当发出请求并且它没有分配可接受的缓存时间戳时,则发出请求时不会返回缓存,因此程序会自行处理所有事情。其结果以新的时间戳存储在缓存中。

如果发出请求并且请求定义它愿意接受 5 分钟缓存 - 并且系统发现这样 - 然后系统从缓存中返回结果。

这意味着我的每条缓存记录都包含一个键(唯一指纹)、结果和创建时间的时间戳。

当前缓存存储在文件系统中,timestamp 是文件修改时间,这会导致 i/o 请求在更高负载时成为杀手。

阅读了多篇文章后,我意识到建议使用 Memcache 和 Memcached 来减少这些调用。

但 Memcache 和 Memcached 只存储指纹和值。没有时间戳,这在技术上意味着我将失去按需缓存时间戳的接受和灵活性。从技术上讲,我必须开始为每个缓存存储两条记录:

指纹数据和数据 指纹时间和时间戳

..这看起来很脏。有其他选择吗?

【问题讨论】:

    标签: php caching memcached


    【解决方案1】:

    如果您在创建时就知道缓存对象在缓存中的持续时间,那么 Memcached 就有您需要的功能。 Memcache::set 函数有一个名为$expire 的参数,您可以在其中以秒为单位设置缓存对象的生命周期。

    如果您只知道从缓存中检索对象时的生命周期,这将不起作用。 我同意每个缓存实体使用两个键是不可行的,因为缓存可能会丢失两者中的一个而保留另一个。 一个(仍然“脏”,但更好)的解决方案可能是为您放入缓存中的每个对象存储一个时间戳。您可以不直接缓存对象,而是使用包含时间戳和对象的数组来做到这一点。

    【讨论】:

    • 我的问题是我的缓存是“按需”的。也就是说,我可以发出一个 API 请求并接受最大 X 秒数的新缓存,或者来自其他地方的另一个 API 请求 - 相同的命令 - 具有不同 Y 秒数的已接受缓存。例如,某些数据仅对登录的用户更“新鲜”(减少平均访问者流量,以免造成太大压力)。由于控制器相同且 API 请求相同,因此唯一不同的是接受的缓存持续时间。遗憾的是,在按需缓存方面,Expires 标志对我没有帮助。
    猜你喜欢
    • 2012-12-03
    • 2012-03-21
    • 1970-01-01
    • 2012-08-20
    • 2010-12-11
    • 2020-03-16
    • 2012-09-06
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多