(我在下面使用单词var,因为我不确定它是什么,我认为它是该类的全局变量)
我想缓存从数据库中的表中获取的值,以保存重复的查询。 我所做的是创建一个单例类,它有一个函数来检查类中的var是否存在一个键,如果它确实只返回var中的值,如果它不查询数据库并加载它进入var并返回它。
或者更好的方法是使用全局变量(全局变量是否具有相同的值,无论从哪个文件访问它?)并且根本不使用类。
或者不要打扰缓存,只需在每次需要值时查询数据库。
我应该发布我想出的内容来源吗?
答案 0 :(得分:7)
查看memcached。它的目的是完全按照你刚才描述的那样做。它需要一个数据库查询并将结果存储在具有更快I / O的内存中。运行相同的查询时,检查该值是否存储在内存中,如果不存在,则仅检查数据库。 memcached在您当前解决方案中的价值在于其跨连接的持久性。
答案 1 :(得分:1)
如果只是链接,您可以将它们存储在会话中,这意味着它们仅在您第一次浏览到包含该链接的页面时创建。如果您能够预先获得所有链接并将其存储在会话中,您可以这样做..
session_start();
setupLinks();
// Getting a link by Link ID
if( ($aLink = getLink(562)) !== null) {
echo "The Link Title is: {$aLink['value']}<br>";
} else {
echo "The Link Title is unknown<br>";
}
// Getting a link by Key
if( ($aLink = getLink('my_link_key')) !== null) {
echo "The Link Title is: {$aLink['value']}<br>";
} else {
echo "The Link Title is unknown<br>";
}
function setupLinks() {
// Only do this once, so if the links exist do nothing
if(!isset($_SESSION['aLinks'])) {
return null;
}
storeLinks(getAllLinks()); // your own custom function
}
function storeLinks($aLinks) {
foreach($aLinks as $aLink) {
$_SESSION['aLinks'][$aLink['id']] = array(
'key' => $aLink['key'],
'value' => $aLink['value']
);
}
}
function getLink($iLinkID) {
return isset($_SESSION['aLinks'][$iLinkID]) ? $_SESSION['aLinks'][$iLinkID] : null;
}
function getLinkByKey($sLinkKey) {
foreach($_SESSION['aLinks'] as $aLink) {
if($sLinkKey == $aLink['key']) { return $aLink; }
}
return null;
}
答案 2 :(得分:0)
这很大程度上取决于您的查询 - 它们对数据库来说有多昂贵和沉重?如果它是非常简单和轻量级的查询 - 我会说不需要缓存(除非你的数量非常多 - 在短时间内数千或数百万)。对于简单的重复查询,您的数据库可能也会使用某种查询缓存 - 这也会加快速度。
缓存昂贵的查询会更有意义。然后你可以按照建议使用memcache,你也可以查看APC缓存。