【发布时间】:2011-02-05 17:48:00
【问题描述】:
我正在使用 PDO 连接到我想要实现 memcached 的系统中的数据库。
我不知道使用什么键来缓存结果,因为我无法使用 PDO 获取最终查询的字符串(因为准备好的语句)。
有什么好办法解决这个问题吗?
提前致谢。
【问题讨论】:
-
你有什么对你有帮助的吗?
我正在使用 PDO 连接到我想要实现 memcached 的系统中的数据库。
我不知道使用什么键来缓存结果,因为我无法使用 PDO 获取最终查询的字符串(因为准备好的语句)。
有什么好办法解决这个问题吗?
提前致谢。
【问题讨论】:
这是一个有趣的教程,它可能会有所帮助 - 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;
}
【讨论】:
$name = 'querycache-' . md5(serialize(array($sql, $params)));
如果你只是要直接根据查询字符串缓存查询结果,Mysql 的查询缓存已经为你做了这件事。不要重新发明轮子。一个潜在的区别是 Mysql 的查询缓存被积极地无效化,因此永远不会返回陈旧(过时、不正确)的数据。根据您处理失效的方式,您的策略可能会进一步减少数据库负载,但代价是定期提供陈旧过时的数据。
此外,当更新发生时,您实际上无法选择性地使各种缓存键过期(您如何知道在插入/更新运行时哪些查询字符串应该过期?);因此,您只需设置一个较短的到期时间(可能以秒为单位),以最大限度地减少您提供陈旧数据的时间。这可能意味着缓存命中率低。最后,你描述的缓存策略实现起来很简单,但是效果不是很好。
请务必阅读 memecached 常见问题解答中的 "Generic Design Approaches" section。一个好的缓存策略会在更新发生时立即删除/替换缓存的数据——这允许您将数据缓存数小时/数天/数周,同时永远不会向用户提供过时的数据。
【讨论】: