我需要一种方法来检测数据库的更改,因为我正在客户端的站点上实现缓存系统。 (缓存整个页面,而不仅仅是查询)
在每个页面的顶部(我有一个“母版页”,所以代码中只有一个位置)我查询数据库以查看它是否size is changed like so。
我将大小相加并得到一个“唯一”数字。将它与前一个进行比较,如果值相同,则传递缓存页面,如果没有,则运行“普通”页面,然后缓存它。
所以我认为理论上这可以工作,因为我只有1个数据库查询,并且基于该查询将网站(根据结果缓存或未缓存)传递给用户。
这可行,如果没有 - 为什么?
编辑:
为最后一次更新时间戳的查询怎么样? LINK
答案 0 :(得分:1)
谁在更新数据库?建议导致更改的进程应该是使缓存失效的进程。当用户/管理员对表格进行更改时,您可以:
建议大小不是'发生变化'的良好指标。忘记行 - 如果bool / bit值改变怎么办?这满足了使缓存无效的条件,但'size'总是相同的。您可以使用last-change-datetime来改进这一点,但是您仍然遇到相同的基本问题 - 查询数据库以检查更改标志。有点破坏了缓存的目的。
考虑另一种方法 - 每 n 分钟重新加载缓存。无论是否有变化,只需重新加载即可。 n 将是符合您业务要求的值。您可以拥有陈旧缓存,并且最多可以提供 n 分钟的旧/陈旧数据。这不是我的建议,而是值得考虑的事情。
答案 1 :(得分:0)
有趣的方法。
根据http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html,您可能会获得Data_length值的近似值 - 并且在示例链接中,存在可疑的圆形数字。我肯定会再尝试一些,以确保它能按照你的想法做到。
您还应该确保这适用于更新,而不仅仅是删除/插入。
我还会在一个非平凡的系统上测试“有任何改变”查询的性能。我猜这是准确的,数据库服务器需要查看文件系统,我猜测它比通过SQL查询它慢很多倍。
其次 - 根据底层应用程序 - 您可能会经常发现应用程序数据发生变化,以至于您不断地使缓存失效。
答案 2 :(得分:0)
您可以使用:
<?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 />
';
}
?>
答案 3 :(得分:0)
您可以CREATE TRIGGER更新,插入,删除和替换要监视的表,将CURRENT_TIMESTAMP()插入到单独表中的某种状态字段中。在每个页面的顶部读取此值并将其与缓存的时间戳进行比较,如果它比缓存旧,则使用缓存。
答案 4 :(得分:0)
SELECT max(UPDATE_TIME)
FROM information_schema.tables
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA = 'DB_NAME_GOES_HERE'
尝试了这个,它就像一个魅力......