2011-08-30 96 views
4

我正在爲使用MongoDB作爲其數據庫引擎的網站上的產品寫一個訪問計數器。MongoDB緩存計數器

Here它說,Mongo保持經常訪問的東西在內存中,並有一個集成的內存中的緩存引擎。

那麼我可以在這個集成的緩存系統上進行中繼,並在每次訪問時默認設置計數器,還是在高流量環境下仍需要另一個緩存層?

回答

5

他們是兩個分開的東西。 MongoDB使用一個簡單的分頁內存管理系統,通過設計將內存映射磁盤空間的最多訪問部分保存在內存中。

因此,這對您經常請求但不經常更改的計數器的幫助最大。不幸的是,網站計數器這兩件事是相互排斥的。因爲遞增計數器通常不會導致MongoDB移動磁盤上的計數器的文檔,讀取緩存仍然相當有效。

主要問題是您的寫入,基本上每次訪問增加不會是非常符合成本效益。我建議一種策略,在您的計數器Web應用程序中緩存即將到來的訪問,並且只在每次X次訪問或每Y秒時(以先到者爲準)推送計數器更新。您的主要目標是減少每秒寫入次數,因此您絕對不希望每次訪問計數器時都要寫入一次數據庫寫入。

+0

我決定存儲在會話廣告訪問和他們耗到服務器每隔X分鐘或Y網頁點擊量。 Dank u wel。 – thwd

1

雖然我從來沒有工作過的那種系統的你描述,我會做以下(假設我已經正確地讀出你的問題,你做的確實只是想增加每次訪問計數器) 。

  • 使用$inc運營商原子進行增量,或使用upserts with modifiers創建文檔結構,如果它已不存在
  • 使用合適的寫入關注加快更新,如果這是安全的這樣做(即寫入關注NONE您的更新調用將立即返回,您將不得不信任Mongo將其保存到磁盤)。當然,這是否安全取決於用例。如果你數數百萬次擊中,那麼1次失敗命中可能不成問題。
  • 如果要存儲的數據的規模是巨大的真實,考慮使用分片到分區寫入