只有在内容发生变化时才缓存mysql结果和重新查询

时间:2010-02-03 16:19:31

标签: php mysql

在页面加载PHP时,是否可以只查询数据库一次。以某种方式存储这些结果并在后续报告中将其显示给用户。有没有办法确定数据库中是否有更改内容,以便我们只能连接到数据库才能获取新的/更改的结果?

请给我一些想法。 感谢。

5 个答案:

答案 0 :(得分:1)

查看MySQL查询缓存。

当没有需要更改时,MySQL将返回存储在内存中的相同结果集。

http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

答案 1 :(得分:1)

缓存,如APC,memcached或Xcache通常具有生存期,然后才会变得陈旧。只要缓存不是陈旧的,就不会对数据库进行任何调用。请注意, no 调用优于数据库中的缓存记录集,因为没有调用会保存整个往返。

如果您的应用程序是数据库的唯一写入源,则只要有人写入数据库,您就可以手动强制缓存在设置生命周期之前到期。然后,当运行查询时,后续查询将重新缓存。

如果有其他来源,例如远程服务器,您必须在数据库中实现一个触发器,该触发器使用更改数据库通知所有应用程序。消息队列最适合用于此目的。

答案 2 :(得分:1)

有一个函数from here,它包装任何其他函数,缓存结果:

function cache_function($buildCallback, array $args= array (), $timeoutMinutes= 60) {
    if (is_array($buildCallback)) {
        $cacheKey= get_class($buildCallback[0]) . $buildCallback[1] . ':' . implode(':', $args);
    } else
        $cacheKey= $buildCallback . ':' . implode(':', $args);

    $file_path= CACHE_PATH . md5($cacheKey);
    @ $file_time= filemtime($file_path);
    $rebuild= $file_time < time() - ($timeoutMinutes * 60);

    //$rebuild= false; // FORCE REBUILD SKIP for WINDOWS

    if ($rebuild or (!$rebuild and !is_readable($file_path))) {
        $build= call_user_func_array($buildCallback, $args);
        file_put_contents($file_path, serialize($build), LOCK_EX);
        return $build;
    }
    return unserialize(file_get_contents($file_path));
}

另见:

http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/

答案 3 :(得分:0)

您可以在数据表中使用其他字段,例如,显示上次记录修改时间戳。然后你可以使用memcache(或另一个缓存子系统)并将其保存到带有最后修改时间戳的读取数据库结果中。

在唯一一个数据库查询中,您可以选择此字段(使用轻型SQL查询和select语句中描述的字段),并将其与从DB值中获取的数据进行比较。如果它们不同,您就知道从具有复杂查询的DB获取新数据。

“轻量级”SQL查询示例:

SELECT MAX(last_modification) AS last_modification FROM data_table

答案 4 :(得分:0)

您可以使用缓存系统来存储数据。

在每次修改对象时,如果可能使用它,可以从缓存中删除它或刷新其缓存版本。

有许多方法可以在PHP中实现缓存,其中包括Memcached。