我想限制在某个时间范围内生成页面的次数,但我不确定如何解决这个问题。
以前,我通过调度要在 cron 作业中生成和保存的页面来解决类似的问题,但这不允许我动态地执行此操作。
这是场景:
我有n
许多用户创建的房间。我想构建一个 JSON api 以允许用户访问房间信息以在他们自己的页面上使用。但是,为每个请求生成一个新的 JSON 结果将是非常低效的,并且会给数据库服务器带来安全风险。我想限制它,以便所有请求在x
一定时间内使用相同的 JSON 结果,而不是每次都使用新结果。
一个简单的缓存系统可以这样完成
if (!file_exists($cacheFile) || filemtime($cacheFile) - time() > $cacheLifetime){
//generate json and save to $cacheFile
}
header("Content-Type: application/json");
header("Content-Length: ".filesize($cacheFile));
readfile($cacheFile);
这个问题是缓存的典型用例。
一般算法是(当请求资源时):
if (resource is cached) {
return cached contents
} else {
construct the resource
store resource in cache
return the resource
}
如果要实现基于时间的失效,算法变为:
if (resource is cached) {
if (cached resource older than threshold) {
remove resource from cache
} else {
return cached contents
}
}
construct the resource
store resource in cache
return the resource
缓存内容的“年龄”是从创建此内容的日期开始计算的,您需要将其与缓存条目一起存储。
根据您的用户网站的动态程度,如果自上一代以来“没有任何变化”,您可能还不想重新生成 JSON 。您的算法将变为:
if (resource is cached) {
if (cached resource older than threshold AND something changed) {
remove resource from cache
} else {
return cached contents
}
}
...
“什么都没有改变”的含义取决于您,可能是用户发布了新内容,或者更新了一些统计数据或用于构建您的资源的任何内容。发生此类事件时,在缓存上设置一个标志。
缓存可以采用任何形式:服务器上的平面文件、数据库行、会话变量等。
使用数据库缓存 json 字符串(不要忘记时间戳)。然后您可以先搜索您的数据库并提供已经生成的 JSON 字符串 :)