2010-10-28 91 views
0

我明白緩存的基本概念,緩存失效內容更新

但有一件事我不能看得懂,甚至我看到一些例子,

假設,

我的第一個要求是上午9點,現在新的更新信息來緩存,然後從其他用戶的另一個內容相同的請求,現在系統得到的緩存文件,而不是數據庫的內容,

例子1:我設置緩存過期的1小時,

現在時間是上午9點,

上午9點:第一個請求:現在閱讀的內容DB和存儲到緩存文件, 9:15:第二個請求:現在系統retrive從緩存中的內容,而不是從數據庫中檢索, 上午09點24分:很少有內容被修改,在數據庫中,

上午9:30:第三請求:NOW系統檢索數據庫或高速緩存,系統怎麼知道DB更新的內容,

這是我的疑問:

例2:如果我沒有設置到期時間:,

然後當系統檢索並將新的更新內容從數據庫存儲到緩存文件。

回答

2

很簡單:只要您更新數據庫中的記錄,就會刪除它的任何緩存副本。這將強制緩存在下一次​​請求記錄時進行更新。

它應該是這樣的:

$data = retrieveData($id); 

retrieveData()做到這一點:

  • 是對$id數據在緩存中?好,歸還它。
  • 如果不是,則從數據庫中提取數據,將副本寫入緩存並返回。

當更新的數據:

updateData($data); 
  • updateData()保存新$data到數據庫中。
  • 它刪除緩存中的任何副本$data(如果有)。

這意味着:

  • 第一次從數據庫中檢索的記錄沒有緩存。一旦你找回它,但它會被緩存。
  • 下一次可以從緩存中獲取相同的記錄。
  • 當記錄更新時,緩存被刪除。
  • 下一次請求記錄時,沒有緩存,所以它將從數據庫中檢索並且緩存再次更新。
  • 沖洗,重複。
+0

好的,看看是否有人從緩存中檢索記錄,如果刪除,那麼用戶如何繼續他的工作,他們得到的只是知道, – Bharanikumar 2010-10-28 04:28:46

+0

@Bhar見更新。 – deceze 2010-10-28 04:36:50

+0

是的正確,但不要誤會我,看到user2開始檢索記錄在上午9時15分(從緩存文件中檢索和閱讀),管理更新記錄在上午9.16,現在user2準備繼續當前閱讀文章,但管理paralaly更新內容,現在會發生什麼,如果管理員提交更新,當前的cach文件將刪除並創建新的,並paralay用戶2繼續當前的記錄,所以我猜,現在他面臨的文件沒有找到prob(即併發概率.. )...對不起,我的問題是錯誤的, – Bharanikumar 2010-10-28 04:43:37

2

有兩種可能的解釋,你說什麼 - 一個是與數據庫保持結果在內存中很難緩存。另一方面,HTTP緩存和它的外觀(假設你正在談論HTTP緩存),你會發現它非常錯誤 - HTTP緩存user1請求一個在3小時內過期的頁面,任何時候要求在接下來的3小時內沒有任何點擊到您的服務器頁面。這對於每個用戶來說(顯然)是分開的 - 當用戶2來時,他不知道他的用戶1是誰,或者他在他的緩存中有什麼,因此用戶2請求來自服務器的數據,此後來自用戶2的未來請求可以從用戶2的緩存。

HTTP還有一種用於緩存未知生命週期數據的方法 - 每次用戶請求頁面時,都會添加一個If-Modified-Since: <Date last fetched/modified>If-None-Match: <server-specified hash>標頭。如果內容沒有改變,服務器可以發送一個304 Not Modified HTTP狀態代碼,並且不必再次發送文件主體。

+0

如果我瞭解你的答案,那麼你試圖說,對於每個用戶請求,系統從DB服務器讀取內容並存儲到緩存中,這5個用戶請求意味着,5個緩存文件會創建知道嗎? – Bharanikumar 2010-10-28 04:37:08

+1

我認爲這個問題不是關於HTTP緩存的問題,而是磁盤在指定時間內緩存渲染結果。 – 2010-10-28 04:40:32

+0

除了他正在談論'系統'是爲他做的,唯一標記的系統是PHP,所以我可以假設的唯一一種緩存就是HTTP。我知道第一個版本,但@deceze覆蓋了很好 – tobyodavies 2010-10-28 05:00:26