2010-02-26 15 views
1

我試圖用Rails和memcached實現頁面瀏覽計數器。每次我渲染一個頁面時,通過rails我增加一個memcached密鑰(key.incr是原子的)。我主要擔心的是在更新我的數據庫記錄之前,密鑰過期或從memcached中刪除的可能性。即使我訪問的所有密鑰的頻率大於其到期時間,memcached也可能會因爲內存已滿而刪除密鑰。Rails和Memcached的頁面瀏覽計數器

有什麼建議嗎? 謝謝 季米特里斯

回答

5

我會用redis作爲memcached replacement。這是perfect for realtime stats。它爲您提供了所需的速度和原子增量,並且它仍然存在。問題解決了。

+0

您的用戶是否使用過Redis?這是第一次聽到它!沒有那麼多的文檔和引用!你是否建議從memcached切換到redis?或並行工作並不壞? – Dimitris 2010-02-26 21:38:22

+0

我在工作中使用Redis,因爲它支持後臺作業處理庫Resque(http://github.com/blog/542-introducing-resque)。至於並行運行,當然。這將是一種簡單的測試方法,無需擔心更改現有緩存設置。你需要redis gem(http://rubygems.org/gems/redis)來連接你的redis服務器。 – 2010-02-26 22:21:15

+0

因此,避免更新開銷的最佳方式是使用redis?如果你想實現一個頁面瀏覽計數器,這將是你的方式? – Dimitris 2010-02-27 00:21:39

1

如果你想要的數據被persitent,你不能將其寫入內存緩存(這是一個緩存mecanism,而不是數據持久性存儲)

基本上,我可能做的是這樣的:

  • 當試圖獲得頁面的計數器:
    • 檢查它是否是存儲在內存緩存
      • 如果是的,使用它
      • 如果沒有,從數據庫中獲取並將其存儲到memcache中
  • 當試圖寫一個計數器(即,計數器+ = 1)
    • 將數據寫入到數據庫(update ... set counter = counter + 1 where...
    • 選擇數據從數據庫返回的;在事務中包裝更新和選擇可能會有所幫助:隔離是數據庫表現良好的事情。
      • ,並立刻將其寫入內存緩存,所以它的最新的下一個「獲取」操作


但我不會爲持久性使用內存緩存:

  • 我永遠不會向memcache寫任何沒有寫入數據庫的數據
  • 持久性是數據庫的工作;不是一個緩存引擎。
+0

其實我想避免多次更新計數器的開銷。我不擔心選擇.. – Dimitris 2010-02-27 00:19:54

+0

許多數據庫將多個更新緩衝到同一個字段。 InnoDB肯定會這樣做。每個更新都以串行方式寫入事務日誌,這在大多數硬盤上都超快,但實際更新的寫出頻率要低得多。 – 2010-04-25 14:58:49

+0

將每個頁面讀入數據庫寫入對於其他玩具站點以及依靠數據庫日誌記錄來處理負載正在玩火都是可怕的。它可以,例如,吹掉你的系統磁盤緩存,這是大多數數據庫如今保持可接受的性能。或者,當一個更大的txn提交併且必須同步一個表時,它可能會停止。 – 2010-10-19 22:20:36