2011-08-22 145 views
1

我需要一種方法來檢測我的數據庫的更改,因爲我正在客戶端的站點上實現緩存系統。 (緩存整個頁面,而不僅僅是查詢)數據庫更改檢測

在每頁的頂部(我有一個「母版頁」,所以只有一個地方在代碼中)我查詢數據庫,看看它是否size is changed like so

我總結大小,並得到一個「唯一」的數字。將它與前一個比較,如果值相同,則傳遞緩存頁面,如果不存在,則運行「正常」頁面,然後緩存該頁面。

所以我認爲在理論上這可以工作,因爲我只有1個數據庫查詢,並基於該網站向用戶提供網站(緩存或未緩存取決於結果)。

可以這項工作,如果沒有 - 爲什麼?

編輯:

怎麼樣cheking最後更新時間戳? LINK

+0

請解釋一下你的「大小」的意思。如果一行被刪除並添加了一個新行?緩存的重點是避免_any_數據庫的工作。 – Oded

+0

是的,我知道,但我想如果我可以縮小到只有一個查詢,加載會更快...... – Andrej

+0

您可以在一個查詢中加載所需的頁面數據_all_。 – Oded

回答

1

誰在更新數據庫?建議導致更改的進程應該是使緩存無效的那個進程。當用戶/管理員引起的變化發生的表,你可以:

  • 如果管理員和麪向公衆的網站使用相同的應用空間(即它們是相同的應用程序),然後簡單地更新在管理員進行更改時緩存。
  • 在某處設置狀態位(可能是會話變量),並定期檢查以重新加載緩存的數據。

建議大小不是一個'發生變化'的好指標。忘記行 - 如果布爾值/位值更改會怎樣?這將滿足使緩存無效的條件,但'大小'將始終是相同的。你可以用最後更改的日期時間來改進,但你仍然有相同的基本問題 - 查詢數據庫以檢查更改標誌。有點失敗了緩存的目的。

考慮另一種方法 - 每隔n分鐘重新加載緩存。無論是否有變化,只需重新加載即可。 n將是一個符合您業務需求的值。你可能會有陳舊的緩存,並提供最多n分鐘的舊/過時數據。這不是我的建議,但需要考慮。

0

有趣的方法。

根據http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html,您可能會得到Data_length值的近似值 - 並且在示例鏈接中存在可疑的整數。我肯定會試驗一下,以確保它能夠做到你認爲它所做的一切。

您還應該確保這適用於更新,而不僅僅是刪除/插入。

我還會測試非平凡系統上「有任何改變」查詢的性能。我猜測,爲了準確,數據庫服務器需要查看文件系統,我猜測它比通過SQL查詢文件系統要慢很多倍。其次 - 根據底層應用程序的不同,您可能會發現應用程序數據變化頻繁,以至於您經常使緩存無效。

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

?> 
0

可以更新CREATE TRIGGER年代後,INSERT,DELETE和REPLACE在桌子上,你想監控插入CURRENT_TIMESTAMP()進入某種狀態字段的在一個單獨的表。在每個頁面的頂部讀取該值,並將其與緩存的時間戳進行比較,如果它比緩存舊,則使用緩存。

0
SELECT max(UPDATE_TIME) 
FROM information_schema.tables 
WHERE TABLE_TYPE = 'BASE TABLE' 
AND TABLE_SCHEMA = 'DB_NAME_GOES_HERE' 

tryed這一點,它的工作原理就像一個魅力....