2017-07-04 103 views
1

根據我的理解。Memcache驅逐策略

  1. 在內存緩存整個存儲器中固定大小的頁面被分割,並且每個頁面所屬的顆粒板坯class.Each頁被進一步劃分成固定大小的塊,塊的大小決定爲每板坯class.Data存儲最適合它的塊(儘量減少內部碎片)。

  2. Memcache使用LRU策略驅逐。

地方我已閱讀,LRU策略框架上,而不是整個data.So應用,可以有情況(不同類的)框架是免費的,但仍然驅逐正在發生一個框架上。

這是memcache行爲的方式嗎?而不是驅逐,不應該調整空置框架的卡盤?

回答

0

如上所述,內存分爲固定大小的頁面(1MB或最大項目配置大小),每個頁面屬於顆粒板類。在開始時,這些頁面實際上並未分配給任何特定的板類。在請求到來時,每個大小範圍都會創建平板類,並將頁面附加到它們。

確定最佳的板類是關鍵。它的算法大致看起來像:

  1. 檢查尾頁(此slab類中最近分配的頁面)以查看它是否有打開/空閒塊。
  2. 如果找到,請將該對象存儲在該頁面中並返回。
  3. 否則,找到一個未分配的頁面並將其分配給這個slab類。
  4. 如果沒有未分配的頁面可用(這並不意味着所有內存都已滿),請執行LRU邏輯以釋放一段時間內未使用的塊(或已過期)。
  5. 將此對象存儲在剛剛釋放的塊(來自步驟4)或空白頁上(來自步驟3)。

現在,回答你的問題。

只有當所有頁面被分配給某些板類時纔會發生驅逐。因爲,所有的頁面都綁定了一些平板類,並準備接受該尺寸範圍內的對象/項目。剩餘的空閒內存不能用於其他大小的對象。即它們不能調整大小。我猜這是爲了簡單而實現的。此方法適用於許多Web應用程序,其中對象大小几乎與查詢結果一樣大小,呈現html頁面。在這種情況下,Memcache將把它擁有的所有頁面分配給您使用的很少的類。

我記得在某個地方讀過,Redis在這方面的內存調整比較靈活。

希望它有幫助!