缓存设计和具有超时的内存缓存(d)记录


Cache design and Memcache(d) records with timeouts?

我为每个 API 调用都设置了一个非常广泛的缓存系统。根据每个命令和请求参数以及特定超时创建唯一的指纹。

当发出请求并且它没有分配可接受的缓存时间戳时,则发出请求而不返回缓存,因此程序会自行完成所有内容。其结果将存储在具有新时间戳的缓存中。

如果发出请求并且请求定义它愿意接受 5 分钟缓存 - 并且系统找到了这样的缓存 - 则系统从缓存返回结果。

这意味着我的每个缓存记录都包含一个密钥(唯一指纹)、结果和制作时间的时间戳。

目前缓存存储在文件系统中,时间戳是文件修改时间,这会导致 I/O 请求在较高负载下成为杀手锏。

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

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

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

..这似乎很脏。还有其他选择吗?

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

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