【问题标题】:How i can design a cache system using PDO and memcached?如何使用 PDO 和 memcached 设计缓存系统?
【发布时间】:2011-02-05 17:48:00
【问题描述】:

我正在使用 PDO 连接到我想要实现 memcached 的系统中的数据库。

我不知道使用什么键来缓存结果,因为我无法使用 PDO 获取最终查询的字符串(因为准备好的语句)。

有什么好办法解决这个问题吗?

提前致谢。

【问题讨论】:

  • 你有什么对你有帮助的吗?

标签: php mysql memcached pdo


【解决方案1】:

这是一个有趣的教程,它可能会有所帮助 - http://techportal.inviqa.com/2009/02/16/getting-started-with-memcached/

我猜你可以通过实现这样的功能来自动化这个过程:

function query($name, $sql, $params, $db, $cache) {
    $result = $this->cache->get($name);

    if (!$result) {
        $stmt = $db->prepare($sql);
        $exec = $stmt->execute($params);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        $cache->add($name, $result);
    }

    return $result;
}

【讨论】:

  • 是的,我在想一些更透明的东西(我不想命名每个查询),我想我将把查询与其余参数连接起来。你觉得呢?
  • 从 $sql + params 构建缓存键相当简单——只需将这一行添加到 Ivo 函数的顶部,并删除 $name 参数:$name = 'querycache-' . md5(serialize(array($sql, $params)));
【解决方案2】:

如果你只是要直接根据查询字符串缓存查询结果,Mysql 的查询缓存已经为你做了这件事。不要重新发明轮子。一个潜在的区别是 Mysql 的查询缓存被积极地无效化,因此永远不会返回陈旧(过时、不正确)的数据。根据您处理失效的方式,您的策略可能会进一步减少数据库负载,但代价是定期提供陈旧过时的数据。

此外,当更新发生时,您实际上无法选择性地使各种缓存键过期(您如何知道在插入/更新运行时哪些查询字符串应该过期?);因此,您只需设置一个较短的到期时间(可能以秒为单位),以最大限度地减少您提供陈旧数据的时间。这可能意味着缓存命中率低。最后,你描述的缓存策略实现起来很简单,但是效果不是很好。

请务必阅读 memecached 常见问题解答中的 "Generic Design Approaches" section。一个好的缓存策略会在更新发生时立即删除/替换缓存的数据——这允许您将数据缓存数小时/数天/数周,同时永远不会向用户提供过时的数据。

【讨论】:

  • 虽然您是对的,但使用 mysql 查询缓存将适用于每个查询,如果您执行大量插入/更新,您会使查询缓存失效,因此它变得无用。我实现了自己的查询结果缓存,因此我可以在指定的时间有选择地缓存特定查询。它最适用于不是最新的数据。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2010-09-21
  • 2019-02-22
  • 2017-05-18
  • 1970-01-01
  • 2015-08-06
相关资源
最近更新 更多