2011-07-09 70 views
2

我正在研究一種方法,由於它的操作和頻率使用相同參數調用的開銷,會從緩存返回值中受益。PHP查詢數組速度;長緩存鍵

我會serialize() - 緩存鍵的參數一起使用,但由於冗長的數組參數,這會導致非常長的鍵。

  • 不PHP數組索引和查找如此長期遭受鍵(覺得從250B至1kB的+)?
  • 到目前爲止這麼好,但我面臨的情況是,在某些情況下,這可能會對我造成嚴重的影響嗎?
  • 基本上,我應該是md5()還是)的鑰匙?

次要澄清
這僅僅是每個請求的緩存,沒有永久存儲。有問題的方法是視圖助手的方法,並且對於每個視圖生成,它可能被稱爲500次或更多次。

+0

不知何故使用MD5代替序列化很奇怪。 –

+0

@Hans Wassink - 'md5()''serialize()'的結果就是我所掌握的。 – Dan

+0

好吧,無論如何,所有的冰雹fyr:D –

回答

4

你一定要把密鑰弄亂。你也許會說:「爲什麼當我能在每個時間點連接一個唯一的鑰匙時,我會冒險得到碰撞?」。簡單的答案是,如果通過字符串連接生成緩存鍵,則必須始終計算空間需求的最壞情況以估計RAM的使用情況。

所以,如果你有一個高速緩存200個條目..和2個字段20個字符最大字符串。最壞的情況是200*2*20*(size of character)。如果您在每個可能的並行連接上加載完整緩存,則將乘以並行連接數量。

使用散列,您始終擁有最低內存需求=關鍵字段的最大內存需求。

如果你有很多連接鍵的值,這將會非常糟糕。

編輯:

即使您按請求使用它,數組也會消耗內存。雖然它是一個緩存,但它從請求的開始到結束都存在。所以你需要考慮到它消耗你的內存中的一定數量的空間,並且使用一個固定的散列值。

第二件事是鑰匙需要比較。如果你用一個字符串鍵訪問一個關聯數組,你的解釋器需要比較關鍵字charwise。如果你有一個生成密鑰的散列方法,這也將是一個固定的步驟數。

如果使用連接,步驟數量將介於最佳和最差情況之間。

+0

謝謝@fyr - 根據我的說明,沒有永久存儲這個緩存,因爲它是每個請求。無論如何,我的密鑰有變得巨大的趨勢,從低端30B到高達1kB +;我正在做一個帶有6個參數函數的'serialize(func_get_args())',其中3個通常是深度數組。我會對它進行基準測試,但對於內存保存和調試轉儲的可讀性,我想我會去散列。 – Dan

1

有這麼長的數組鍵肯定不是典型的,但你可能不得不做基準猜測它實際上給了多少放緩。如果有疑問,只需md5吧 - 從你說的話來看,與md5時間相比,後面的加速仍然是非常微不足道的。