2009-07-23 41 views
4

我正在研究一個winform應用程序,該應用程序將由美國和海外的團體使用,取代使用舊技術構建的現有應用程序。保持半靜態數據保持新鮮的策略

舊的應用程序的性能海外是相當緩慢的,由於過度調用回美國的數據庫服務器,所以我想緩存客戶儘可能儘可能多的東西。

什麼是緩存數據的最好方法是不經常更改的東西 - 但可能?如何避免數據過期而無法完全在每個負載上完成?

回答

2

一個快速的解決方案是爲數據創建某種類型的校驗和,並且客戶端只會首先要求。如果情況相同,則不需要更多數據,該部分是最新的。如果數據發生變化,總和會發生變化,客戶端會獲得新數據以及新數據。

轉移只有每次聽起來應該是少於所有的數據。

+0

這是行不通的。如果校驗和改變數據是不同的,但如果數據改變,校驗和可能不會改變。海報需要知道數據何時更改,而不是校驗和。 – 2009-07-26 14:47:08

0

你可能會保持其可能對一個給定的一套可能報告修訂ID的對象或更改爲0不變,1水印或其他指標SQL表函數或視圖或別的東西,重量輕,然後刷新只有那些需要更新的對象。

1

如果您的數據很少更改,您可以使用SQL觸發器設置一個「更新」標誌相當於 - 然後簡單地搭載該標誌上的任何其他客戶端服務器通信。如果將插入/更新/刪除觸發器添加到所有半靜態表和一個看門狗表,那麼您應該很好。

0

我認爲最好的方法是創建一個單獨的表來跟蹤數據。該表只包含一個表名稱列表,以及該表最後一次修改時間。然後,您將創建一個觸發器,在該表上發生插入/更新/刪除時更新字段。當客戶想要檢查數據時,您將檢索數據並從該表中獲取日期並存儲它。客戶端下一次需要這些數據時,只需在該表中查找表名,獲取日期並將其與您擁有的日期進行比較即可。如果數據庫中的數據庫較大,則應該從服務器中獲取數據。

唯一的缺點這種方法是在一個表中的任何改變,你會去到數據庫並再次檢索所有的數據,即使變化不會影響特定的SQL查詢。如果你的數據不經常改變,這應該不會太重要。

0

如果應用程序本身可以知道是否有數據更新,請求延遲縮放可能是最簡單的選擇。當應用程序啓動時,請求數據,然後在最小刷新延遲後再次請求。如果數據未更改,則請求之間的刷新延遲加倍。如果沒有檢測到更改(可能有最大限制),則繼續加倍延遲,然後開始設置。這是減少服務器負載的通用模式,並且非常容易在不改變模式或Web服務的情況下實現客戶端。

1

不知道如何將數據集可能看起來但如何計算散列像SHA256對數據集和存儲在客戶端和服務器上的哈希值。然後,在從服務器獲取數據之前,僅提取哈希並與客戶端上的本地哈希進行比較。如果哈希匹配使用本地存儲的數據集。

+0

對不起,剛纔看到luvat提到了一個類似的解決方案。我可能只是補充一點:你可以在你的服務器上有一個表,用來存儲你使用的sql查詢和散列。因此,當您執行請求時,首先計算查詢字符串上的散列值,然後向服務器請求與查詢字符串散列值相關聯的數據散列值 – 2009-07-24 13:47:46

0

無論何時您想要緩存更改的數據庫或表,您都必須維護一個時間戳。如果有相關的表格,或者在相似的時間段內發生變化的表格,則可以將它們分組爲共享相同時間戳的家族。

每當你想你首先要問的時間戳數據。如果它沒有改變,請使用緩存的數據。如果它發生了變化,請詢問最新數據,更新緩存,並遞歸請求所有祖先數據的時間戳。

校驗和不起作用,因爲他們可能會發生衝突,您必須要求新數據來檢查衝突。舊的/已更改的標誌將不起作用,因爲您不知道數據何時更改,它可能早於您之前的時間戳。版本ID在每次更改後都會增加,並且永遠不會降低。

如果您使用的是RESTful Web服務,則GET HEAD代碼將僅返回包含時間戳的HTTP標頭。如果你的web服務不包括時間戳,你將不得不定義新的返回它們。