【问题标题】:How to design a simple page cache?如何设计一个简单的页面缓存?
【发布时间】:2013-06-25 07:51:50
【问题描述】:

我想限制在特定时间范围内生成页面的次数,但我不确定如何解决这个问题。

以前,我通过安排要在 cron 作业中生成和保存的页面来解决类似的问题,但这不允许我动态地执行此操作。

这里是场景:

我有n 用户创建的房间数。我想构建一个 JSON api 以允许用户访问房间信息以在他们自己的页面上使用。但是,为每个请求生成一个新的 JSON 结果将是非常低效的,并且会给数据库服务器带来安全风险。我想限制它,以便x 时间内的所有请求每次都使用相同的 JSON 结果而不是新结果。

【问题讨论】:

    标签: php mysql json apache lamp


    【解决方案1】:

    这个问题是缓存的典型用例。

    一般算法是(当请求资源时):

    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
        }
    }
    ...
    

    “什么都没有改变”的含义取决于您,可能是用户发布了新内容,或者更新了一些统计信息或用于构建您的资源的任何内容。当此类事件发生时,在缓存上设置一个标志。

    缓存可以采用任何形式:服务器上的平面文件、数据库行、会话变量等。

    【讨论】:

      【解决方案2】:

      一个简单的缓存系统可以这样完成

       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);
      

      【讨论】:

        【解决方案3】:

        使用数据库缓存 json 字符串(不要忘记时间戳)。然后你可以先搜索你的数据库并提供已经生成的 JSON 字符串 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-11
          • 2014-03-07
          • 1970-01-01
          • 2017-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-25
          相关资源
          最近更新 更多