&引用;“缓存”;php中的数据库值数组(2个选项,哪个更好?)

&引用;“缓存”;php中的数据库值数组(2个选项,哪个更好?),php,mysql,database,caching,Php,Mysql,Database,Caching,(我在下面使用var这个词,因为我不确定它是什么,我认为它是类的全局变量) 我想缓存从数据库中的表中获取的值,以保存重复的查询。 我所做的是创建一个singleton类,它有一个函数来检查类中的变量,如果存在键,则只从变量返回值,如果不存在,则查询数据库并将其加载到变量中并返回值 或者更好的方法是使用全局变量(无论从哪个文件访问全局变量,全局变量是否具有相同的值?)而不使用类 或者不必费心缓存,只要在每次需要值时查询数据库即可 我应该发布我的想法的来源吗?查看memcached。它的目的就是要做

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

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

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

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


我应该发布我的想法的来源吗?

查看memcached。它的目的就是要做你刚才描述的事情。它接受数据库查询并将结果存储在内存中,内存具有更快的I/O速度。当运行相同的查询时,您会检查该值是否存储在内存中,并且仅在值未存储时才命中数据库。memcached在当前解决方案中的价值在于跨连接持久化

查看memcached。它的目的就是要做你刚才描述的事情。它接受数据库查询并将结果存储在内存中,内存具有更快的I/O速度。当运行相同的查询时,您会检查该值是否存储在内存中,并且仅在值未存储时才命中数据库。memcached在当前解决方案中的价值在于跨连接持久化

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


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

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


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

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

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;
}
session_start();
setupLinks();
//按链接ID获取链接
if(($aLink=getLink(562))!==null){
echo“链接标题是:{$aLink['value']}
”; }否则{ echo“链接标题未知
”; } //通过键获取链接 if($aLink=getLink('my\u link\u key'))!==null){ echo“链接标题是:{$aLink['value']}
”; }否则{ echo“链接标题未知
”; } 函数setupLinks(){ //只做一次,所以如果链接存在,什么也不做 如果(!isset($\u会话['aLinks'])){ 返回null; } storeLinks(getAllLinks());//您自己的自定义函数 } 函数storeLinks($aLinks){ foreach($aLinks作为$aLink){ $\u会话['aLink'][$aLink['id']]=array( 'key'=>$aLink['key'], 'value'=>$aLink['value'] ); } } 函数getLink($kid){ 返回isset($\u会话['aLinks'][$iLinkID])?$\u会话['aLinks'][$iLinkID]:null; } 函数getLinkByKey($sLinkKey){ foreach($\会话['aLinks']作为$aLink){ 如果($sLinkKey==$aLink['key']){返回$aLink;} } 返回null; }
如果只是链接,您可以将它们存储在会话中,这意味着它们仅在您第一次浏览到包含链接的页面时创建。如果您能够提前获取所有链接并将它们存储在会话中,您可以这样做

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;
}
session_start();
setupLinks();
//按链接ID获取链接
if(($aLink=getLink(562))!==null){
echo“链接标题是:{$aLink['value']}
”; }否则{ echo“链接标题未知
”; } //通过键获取链接 if($aLink=getLink('my\u link\u key'))!==null){ echo“链接标题是:{$aLink['value']}
”; }否则{ echo“链接标题未知
”; } 函数setupLinks(){ //只做一次,所以如果链接存在,什么也不做 如果(!isset($\u会话['aLinks'])){ 返回null; } storeLinks(getAllLinks());//您自己的自定义函数 } 函数storeLinks($aLinks){ foreach($aLinks作为$aLink){ $\u会话['aLink'][$aLink['id']]=array( 'key'=>$aLink['key'], 'value'=>$aLink['value'] ); } } 函数getLink($kid){ 返回isset($\u会话['aLinks'][$iLinkID])?$\u会话['aLinks'][$iLinkID]:null; } 函数getLinkByKey($sLinkKey){ foreach($\会话['aLinks']作为$aLink){ 如果($sLinkKey==$aLink['key']){返回$aLink;} } 返回null; }
memcached除了跨连接持久化之外,还可以由多台服务器访问,这与singleton/globals/APC中的缓存不同。当您有多台服务器时,由于在每台服务器上存储重复的缓存值,无法共享缓存的成本会很快变得非常高。对不起,什么是跨连接持久性?当您使用变量(全局或非全局)时,您只能将其用于该请求。因此,当该用户加载下一页、刷新或其他用户加载该页时,该变量在下一个“连接”中将不再可用。Memcache在连接之间是持久的,因为数据仍然