在php中“缓存”一组数据库值(2个选项,哪个更好?)

时间:2010-07-27 21:51:31

标签: php mysql database caching

(我在下面使用单词var,因为我不确定它是什么,我认为它是该类的全局变量)

我想缓存从数据库中的表中获取的值,以保存重复的查询。 我所做的是创建一个单例类,它有一个函数来检查类中的var是否存在一个键,如果它确实只返回var中的值,如果它不查询数据库并加载它进入var并返回它。

或者更好的方法是使用全局变量(全局变量是否具有相同的值,无论从哪个文件访问它?)并且根本不使用类。

或者不要打扰缓存,只需在每次需要值时查询数据库。

我应该发布我想出的内容来源吗?

3 个答案:

答案 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缓存。