2009-11-24 48 views
0

我有一個大表,我想將結果存儲在Memcache中。我在我的服務器上設置了Memcache,但似乎沒有任何有用的文檔(我可以找到)如何有效地傳輸大量數據。我目前能想到的唯一方法是編寫一個mysql查詢來獲取表的鍵值和值,然後將其保存在Memcache中。它不是一個特別可擴展的解決方案(特別是當我的查詢生成幾十萬行時)。有關如何做到這一點的任何建議?轉移到Memcache

編輯:關於我想要做什麼有一些困惑,讓我說我有一個有兩個字段(鍵和值)的表我在拉動信息並且必須匹配到鍵和返回值我想避免每頁加載執行約1000個查詢Memcache似乎是一個完美的替代方案,因爲它設置爲使用鍵值,可以說這個表有100K行。知道從db表到memcache的數據是運行一個查詢,循環遍歷表中的每一行,並創建一個單獨的memcache行。有更好的方法轉移我的桌子嗎?

+3

memcache是​​關鍵值存儲。請記住,您無法查詢memcache,只有在您知道密鑰存儲的情況下才提取現有數據。 – 2009-11-24 04:00:55

+0

memcache是​​一個* cache *,你不應該向它導入數據。 – 2009-11-24 04:14:05

回答

0

拉斯,

這聽起來幾乎一樣,如果使用與存儲引擎設定一個MySQL表MEMORY可能是你的路要走。

基於RAM的表爲您提供了使用SQL的靈活性,並且還可以防止由於大量讀取/寫入(如memcached)而導致的磁盤顛簸。

但是,基於RAM的表格非常不穩定。如果有什麼東西存儲在表中,而不是刷到基於磁盤的表上,並且你失去了電源......那麼,你只是丟失了你的數據。這就是說,確保每隔一段時間刷新一個真正的基於磁盤的表。

此外,使用內存表的另一個優點是可以存儲所有典型的MySQL數據類型,因此不存在1MB大小限制。

1

其實,您可以在陣列中的所有行並存儲在內存緩存

memcache_set($memcache_obj, 'var_key', $your_array); 

的數組,但你要記住幾件事情

  • PHP將系列化/從內存緩存反序列化數組,所以如果你有很多行可能會比實際查詢數據庫慢012然後再查詢數據庫
  • 您無法進行任何篩選(無SQL),如果您想過濾一些項目,您必須自己實現此篩選器,並且它可能會執行最差的數據庫發動機。
  • 內存緩存不會存儲更多的則1兆字節 ...

我不知道你什麼嘗試實現,但一般使用內存緩存的是:

  • 商店的結果SQL /耗時處理,但生成的行數應該很小
  • 存儲一些預先創建的(X)HTML blob以避免數據庫訪問。
  • 用戶會話存儲
+0

嗨,非常感謝你的回答。我編輯了我的問題,以更清晰地說明我正在嘗試做什麼,它看起來像是一個完美的memcache應用程序,但我可能完全是錯誤的 此外,當你說Memcache將不會存儲超過1 MB,意味着我的值不能超過1 MB,我假設我的服務器上的Memcache中可以有超過1 MB的存儲空間.... – Russ 2009-11-25 01:48:08