我正在使用PDO连接到我想要实现memcached的系统中的数据库。
我不知道哪些密钥用于缓存结果,因为我无法使用PDO获取最终查询的字符串(因为准备好的语句)。
解决这个问题有什么好主意吗?
提前致谢。
答案 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;
}