做web,經常會用到key-value的緩存,雖然快,但緩存的維護是個問題,就拿sgementfault舉例來說,如果我來做,首頁的問題分頁就涉及到
1.問題總數緩存
2.每頁問題清單緩存
現在管理員刪除了一個問題,那麼為滿足實時性,肯定需要更新緩存
1.問題總數緩存-1
2.每頁問題清單緩存如何更新?
當然可以查數據庫算出來,是否有這個必要?
這隻是個例子,為了說明問題,為了更新一個緩存而造成了另外的數據庫查詢開銷。在實際過程中,我經常用查詢條件的組合作為key,這使得我在更新緩存時無從下手(雖然我自己手工維護了一個緩存key的清單,但難免會有遺漏,終歸不是好辦法)。但如果把緩存的key都定義死,則緩存的使用不是那麼靈活。
建議如此處理:
1. 問題總數快取
參考:http://www.php.net/manual/zh/memcache...
2.每頁問題清單快取如何更新?
沒有細想,如果是我的話可能會用一個end_id作為結束戳,然後有新的問題過來就向前遞增,每100+匯總一次刷新,主要還是看量,脫離了量的情況下不好判斷(開始小的情況下就直接刷db三分鐘一次也沒問題)
1. 問題總數快取的用@jawa 提供的 memcache incr/decr 就挺好的
2. 每頁問題清單,這個,可以不維護清單而只快取問題內容,清單本身從資料庫查就好。也的確是如@jawa 所說,看量。細節上可以有很多解決方案,有非常粗粒度的方法,比如前面說的列表本身直接從數據庫查;也有非常細的方法,比如新浪微博的內容轉發、評論次數都是二次獲取,解耦了內容的變化(較少)和計數的變化(頻繁)
使用快取主要目的是為了減輕資料庫的壓力,過於頻繁的更新快取是不太合理的。
一、放棄即時性,當資料到達某個定義的閥值時更新快取。
二、使用搜尋引擎如sphinx的即時增量索引。