我需要一种方法来检测数据库的更改,因为我要在客户端的站点上实现一个缓存系统。(缓存整个页面,而不仅仅是查询)
在每个页面的顶部(我有一个“母版页”,所以在代码中只有一个地方),我查询数据库,看看它是否有size is changed like so。
我将大小相加,得到一个“唯一”的数字。将其与前一个值进行比较,如果值相同,则交付缓存的页面,如果不同,则运行“正常”页面,然后缓存该页面。
所以我认为在理论上这是可行的,因为我只有一个数据库查询,并在此基础上将站点(缓存或未缓存,取决于结果)交付给用户。
这能行得通吗?如果不行-为什么?
编辑:
检查最后一次更新的时间戳如何?LINK
发布于 2011-08-22 22:16:35
谁在更新数据库?建议导致更改的进程应该是使缓存无效的进程。当用户/管理员导致表发生更改时,您可以:
建议的大小不是“发生更改”的良好指标。忘记行-如果布尔值/位值发生变化怎么办?这将满足使缓存无效的条件,但“大小”将始终相同。您可以使用last- change -datetime来改进这一点,但是仍然存在相同的基本问题--查询数据库以检查更改标志。这有点违背了缓存的目的。
考虑另一种方法--每n分钟重新加载一次缓存。无论是否有更改,只需重新加载即可。N将是一个适合您的业务需求的值。您可能拥有陈旧的缓存,并且为旧/陈旧数据提供服务的时间最多为n分钟。这不是我的建议,而是一些需要考虑的东西。
发布于 2011-08-22 22:16:10
有趣的方法。
根据http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html的说法,您可能会得到Data_length值的近似值-在示例链接中,有可疑的舍入数字。我肯定会做更多的实验,以确保它能像你想象的那样工作。
您还应该确保这适用于更新,而不仅仅是删除/插入。
我还会在一个非平凡的系统上测试"has changed“查询的性能。我猜测,为了使这一点更准确,DB服务器将需要查看文件系统,我猜测这比通过SQL查询要慢很多倍。
其次,根据底层应用程序的不同,您可能会发现您的应用程序数据更改太频繁,以至于您经常会使缓存无效。
发布于 2011-08-22 22:23:00
您可以使用以下命令:
<?php
mysql_connect("localhost","root","");
$result = mysql_query("SHOW TABLE STATUS FROM test;");
while($array = mysql_fetch_array($result)) {
$total = $array[Data_length]+$array[Index_length];
echo '
Table: '.$array[Name].'<br />
Data Size: '.$array[Data_length].'<br />
Index Size: '.$array[Index_length].'<br />
Total Size: '.$total.'<br />
Total Rows: '.$array[Rows].'<br />
Average Size Per Row: '.$array[Avg_row_length].'<br /><br />
';
}
?> https://stackoverflow.com/questions/7148672
复制相似问题