2011-12-05 64 views
1

這是一個棘手的問題,不要過於籠統或太寬泛,所以如果對於這個問題太高級別,我提前致歉&答案格式。基於流的網站 - 使用memcache優化的選項(d)

我正在研究一個包含經常更新的Feed類型系統(la'twitter風格)的系統,以及基於用戶投票對項目進行排名的系統。該系統基於使用PHP編寫的json/restful api,訪問(主要)innodb mysql數據庫。數據庫本身實際上是非常高度優化的,並且正常化。該系統還利用獅身人面像進行搜索,並使用一些外部隊列處理系統進行數據處理。

我的問題是:沒有人有任何建議的方式來實現memcache在一個系統中,這麼多依賴於數據庫表關係?

例如:「熱門列表」是基於每次有人對某件物品進行投票時計算的排名。有人投票,計算該項目的新「排名」,並將其作爲整數存儲在mysql數據庫中。

像cron作業這樣每隔幾分鐘緩存一次這樣的條目列表會更有效率,從而降低了db的頻率 - 或者 - 從數據庫中提取'id'會有意義嗎?而不是緩存列表,緩存項目數據並單獨從內存中爲列表中的每個項目提取數據?

曲線球是對於每個項目,api調用也需要返回用戶是否對該項目進行投票或不投票,這也可以被緩存,但是很難緩存存在需要檢查的內容對於。

我發現它是一種心智體操,試圖確定什麼數據它實際上有意義或有可能緩存時,如此多依賴於數據更新如此之多。無論哪種方式,不知道這是否是正確的問題,但是我會從任何有很多經驗處理緩存的人中獲得一些洞察,這些應用程序只有很少的靜態元素。


順便說一句,我已經認真考慮尋找到使用Redis的管理「位列項目」飼料...即,而不是打在秩更新,而不僅僅是更新Redis的列表中選擇數據庫。雖然我只花了一點時間處理redis,但我並不是100%認爲這是在系統上處理這種需要超級可擴展性的最佳方式。

回答

1

Redis在這裏有一些重要的東西:pub/sub。這將允許您發佈事件等事件,並立即向所有聽衆通知(非常可擴展)。它還具有各種「* ex」操作(原子,存在測試) - SETEX,SETNX等加上原子列表交換等。

我個人認爲redis有很多可以提供您的場景。

+0

嗯...你已經調整了我的興趣在這裏關於redis。就我而言,「投票」是事件,算法是處理程序,redis會存儲結果?我認爲我理解這個概念的水平很高,但從功能層面來看,redis如何在每次投票或者請求「熱門/熱門」列表時作爲替代數據庫的替代品? –

+0

@Jonathan我們在這裏以不同的方式使用它 - 有時作爲事件本身,但我們有時也使用redis來存儲數據的可緩存快照,並在我們更改/無效時發送消息。我並不認爲自己是完美的redis guru(儘管我從頭開始寫了一個客戶端 - BookSleeve),但我真的認爲這是值得研究的。 –

+0

謝謝馬克!你讓我更多地考慮Redis如何爲我工作......我非常感謝你的反饋! –