2014-07-02 63 views
0

基本上我會緩存所有用戶輸入數據爲此(例如,我會緩存用戶評論)。我正在使用Simple PHP Cache。 現在我會做的是運行像(僞代碼):如何有效地重新加載緩存的數據

$cache = new Cache(page-specific-cache); 

if(hasNewComments()) { 
    $cache->erase('comments'); 
    $cache->store('comments', array(/*array of comments...*/), 60); 
} 
//...show comments and stuff 

現在我的問題是:我應該運行上面的代碼塊,或者我應該嘗試做類似下面的代碼,其中我還檢查緩存是否已過期,是否已重新生成?在這種情況下,這似乎有點過分了?

$cache = new Cache(page-specific-cache); 

if((hasNewComments()) || ($cache->isCached('comments') && $cache->isExpired('comments'))) { 
    $cache->erase('comments'); 
    $cache->store('comments', array(/*array of comments...*/), 60); 
} 
//...show comments and stuff 

注意

isExpired()方法不來帶班,我創造了它自己,這是它的樣子:

public function isExpired($key) { 
    if (false != $this->_loadCache()) { 
     $cachedData = $this->_loadCache(); 
     return $this->_checkExpired($cachedData[$key]['time'], $cachedData[$key]['expire']); 
    } 
    } 
+0

在你顯示的代碼中,你實際上從未從緩存中讀取*如果你從未讀取它,那麼緩存沒有意義。通常情況下,如果它從緩存中讀取(當緩存過期時應該自行停止存在),那麼您將刷新數據。 – deceze

+0

@deceze對不起,我沒有包括那部分。基本上高速緩存檢查完成後,讀取('retrieve')完成後追加到模板變量。 – Darren

回答

1

顯然你」在嘗試使用緩存之前重新檢查新評論。這使得緩存毫無意義。緩存的要點是從某個系統中取出一些負載(比如不斷從數據庫獲取註釋),以換取過時數據的可能性。你的邏輯應該是這樣的(僞):

comments = cache.get('comments') 
if !comments 
    comments = database.get('comments') 
    cache.store(key='comments', value=comments, expires=3600) 

print comments 

緩存應該返回false/null /不管數據是否要麼從未它過期,如果之前或緩存。如果您的緩存沒有自動失效系統,請使用comments數組保存時間戳,並在獲取緩存數據後手動執行檢查。

同樣,高速緩存的折衷是,當數據庫中已經有新數據時,您可以顯示過時的數據。如何以及何時到期緩存是編程中的兩大問題之一(另一個是命名的東西)。

要麼你不關心過了一段時間的評論;在這種情況下,明智地選擇你的到期時間。

否則,一個好的策略是永遠不會讓緩存本身過期,但在發佈新評論時顯式刪除緩存。這可確保您始終擁有最新的數據,而無需經常檢查。但是,如果您的評論頻率太高以至於緩存被永久刪除,則首先放置緩存毫無意義。

這是所有的折衷。選擇你的甜蜜點。

+0

謝謝你,那實際上正是我所追求的! – Darren

+0

將緩存中的評論數量存儲起來,然後'如果cache.get()' - >'數據庫檢查評論對緩存評論計數計數 - >'如果更高的更新緩存和服務' - >'否則是好的只是服務'? – Darren

+1

這可能是另一個折衷。將* some * load放在數據庫上,但如果不需要,則不會提取所有內容。我可能寧願隨着最新評論的時間戳而不是數字。但是,這對於加快速度來說是否確實有用,這是另一個問題。基準。 – deceze

相關問題