代码之家  ›  专栏  ›  技术社区  ›  Jonathan.

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

  •  1
  • Jonathan.  · 技术社区  · 14 年前

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

    我想缓存从数据库中的表中获取的值,以保存重复的查询。 我所做的是创建一个singleton类,该类有一个函数来检查类中的var(如果存在键),如果存在键,则只返回var中的值,如果不存在,则查询数据库并将其加载到var中并返回它。

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

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

    我应该把我想出来的东西的来源贴出来吗?

    3 回复  |  直到 14 年前
        1
  •  0
  •   Laimoncijus    14 年前

    这取决于您的查询——它们对于数据库来说有多昂贵和沉重?如果这是一个非常简单和简单的查询——我会说不需要缓存(除非你有大量的缓存——在短时间内有数千或数百万个)。对于简单的重复查询,您的数据库可能也会使用某种查询缓存——这也会加快速度。

    缓存昂贵的查询会更有意义。然后您可以按照建议使用memcache,也可以查看apc缓存。

        2
  •  7
  •   Justin Lucas    14 年前

    签出memcached。它的目的是做你刚才描述的事情。它需要一个数据库查询并将结果存储在具有更快I/O的内存中。当运行同一个查询时,您将检查该值是否存储在内存中,如果不存储,则只访问数据库。当前解决方案上memcached的值是它在连接之间的持久性。

        3
  •  1
  •   Paul Dragoonis    14 年前

    如果只是链接,你可以将它们存储在你的会话中,这意味着它们只在你第一次浏览到一个页面时创建。如果您能够提前获取所有链接并将它们存储在会话中,那么您可以这样做。

    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;
    }