2012-01-06 47 views
0

我有一個Java Webserivce查詢數據庫以將數據返回給用戶。數據庫查詢很昂貴,所以我有每60秒運行一次的Cron作業來緩存memcached中的當前數據。 數據元素在一段時間後「關閉」,這意味着它們不會被「獲取當前數據」請求返回。所以這些請求可以利用緩存的數據。如何緩存數據中的任意時間差異(java web服務)

客戶端使用名爲'since'的功能來獲取自特定時間戳(最後一個請求的時間戳)以來發生更改的所有數據。如果該數據在該時間戳之後關閉,則會返回任何關閉的數據。

如何有效存儲差異/自數據?對於每個自請求訪問數據庫的速度太慢(並且不能很好地擴展),但是由於客戶端可能要求任何時間,因此很難生成通用緩存。

我試過讓cron作業也構建一個自緩存。它會做'自''請求使自上次更新以來發生的所有變化,並試圖強制客戶端請求匹配cron作業請求後的時間戳。但是,cron花了多長時間,加上客戶端和玉米工作都不會每60秒運行一次,所以這些小的差異加起來就不一樣了。這最終導致一些數據關閉,但緩存或客戶端錯過了它。

我甚至不知道要尋找什麼來解決這個問題。

回答

1

我會試圖在數據庫前貼一段時間到期的緩存(例如ehcache和timeToLive集合),並有任何更新過程的數據庫也將數據直接放入緩存(重置或刪除現有的匹配元素)。然後,webservice只會在除初始連接之外的任何地方都訪問緩存(速度非常快),過濾出一些太舊的元素並將剩餘的元素髮送到客戶端。隨着時間流逝,舊數據逐漸從緩存中刪除。然後確保服務啓動時預先填充緩存。

+0

我最近發現了Ehcache,它具有很好的可搜索功能,所以我可以使用像DB這樣的緩存排序並查找我需要的記錄。另外,它記錄每個記錄的時間,以便我可以搜索「以來」。我想你的想法也會起作用。但是,答案肯定是Ehcache! – dontocsata 2012-01-25 00:16:27

0

您的數據是否有時間戳?我們在公司裏緩存時遇到了類似的問題,時間戳記解決了這個問題。您可以對數據使用「Valid-upto」時間戳,以便您的緩存和客戶端可以知道數據何時有效。

+0

每當進行更改時,數據庫都會對數據進行時間戳記。這是自請求使用的內容。我不確定你的意思是有效的。數據正在實時變化,客戶需要能夠請求自特定時間以來發生了什麼變化,所以我不確定這與數據的有效性有何關係。 – dontocsata 2012-01-06 14:56:34

+0

我想說的是。隨同您的數據一起傳遞一個字段「有效Upto」到客戶端和緩存。以便他們可以知道該數據何時有效並可以被緩存。 – 2012-01-06 15:00:05