我如何使用PDO和memcached设计缓存系统?

时间:2010-04-08 14:29:25

标签: php mysql memcached pdo

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

我不知道哪些密钥用于缓存结果,因为我无法使用PDO获取最终查询的字符串(因为准备好的语句)。

解决这个问题有什么好主意吗?

提前致谢。

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分: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;
}
相关问题