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

6

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

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

有什么好的想法来解决这个问题吗?

提前感谢。


你有找到任何有用的东西吗? - Mohammad Fanni
2个回答

7
如果你只是根据查询字符串直接缓存查询结果,那么Mysql的查询缓存已经为你做了这件事。不要重复造轮子。唯一的潜在区别是Mysql的查询缓存会被积极地使无效,以便永远不返回过时(不正确)的数据;根据你如何处理失效,你的策略可能会进一步减少数据库负载,但代价是定期提供陈旧的、过时的数据。
此外,当更新发生时,你将无法有选择地使各种缓存键过期(当插入/更新运行时,你怎么知道哪些查询字符串应该过期?);因此,你只需设置一个短的过期时间(可能是秒),以最小化你提供陈旧数据的时间。这可能意味着低缓存命中率。最后,你所描述的缓存策略很容易实现,但并不是非常有效。
请确保阅读memecached FAQ的"通用设计方法"部分。一个好的缓存策略是在更新发生时立即删除/替换缓存数据--这允许你缓存数据数小时/数天/数周,并同时从不向用户提供过时的数据。

尽管您是正确的,使用mysql查询缓存将适用于每个查询,如果您执行大量的插入/更新,则会使查询缓存无效,因此变得无用。我实现了自己的查询结果缓存,以便可以有选择性地缓存特定查询一段指定时间。对于不需要即时更新的数据,它的效果最佳。 - Blucreation

0
这是一个有趣的教程,可能会有帮助 - 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;
}

是的,我在考虑更透明的方法(我不想命名每个查询),我想我会将查询与其余参数连接起来进行哈希处理。你觉得呢? - Castro
5
从$sql和$params构建缓存键相当简单--只需将此行代码添加到Ivo函数的顶部,并删除$name参数:$name = 'querycache-' . md5(serialize(array($sql, $params))); - Frank Farmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接