2016-10-05 18 views
2

我被要求在最近的一次Skype採訪的15分鐘內設計這樣的包裝,這是我的設計。我希望能夠在這個設計中獲得更多的意見,並且如果有更好的設計方法。如何設計memcached的包裝以允許大於1MB的值?

要求: Memcached(沒有任何其他數據結構)支持任意大小的值輸入的鍵值存儲包裝,因爲Memcached在值存儲上限制爲1MB。

提案

  1. 數據結構:相同的分佈式緩存

  2. set(key, value):說輸入鍵是memlarge

    • 檢查sizeOf(value)> 1MB,如果是的,spli將這些值轉換成多個二進制文件,每個二進制文件的大小分別爲1MB和set,其密鑰方案如下:

    • 計算密鑰的固定大小哈希碼(例如,使用md5):memlarge-1memlarge-2,...,memlarge-n,說結果會ABCDEFGHI

    • 串聯這些固定大小的散列碼,並將其保存爲原來的鍵值,添加後綴和前綴以防止get方法將其他值錯誤地解釋爲一組鍵。所以,現在memlarge緩存與價值prefixABCDEFGHIsuffix,即get('memlarge')將先返回prefixABCDEFGHIsuffix(當時下文)
  3. get(key)

    • 檢查結果有陣

      前綴和後綴
    • 如果是,則執行後續的get操作,通過定界值來獲取原始值由哈希代碼知道大小 - >get('ABC'), get('DEF'), get('GHI'),並最終加入了價值返回給用戶

批判的建議,跟進的問題:

  1. 即使帶有後綴和前綴的情況下,隨機保存的值仍有一個(非常小的)前綴後綴&的機會。然後,修正後將省略前綴/後綴和校驗和(md5)之後的剩餘值的長度檢查。

  2. 值大小4MB將需要5 get操作。有沒有辦法將它減少到4?

    我認爲一個解決方案將使用鏈表的想法,但在一個位/字節級的實現。值塊將在1MB限制之前結束,以節省「信號」的空間,這需要另一個get(下一個節點)。那麼信號可以類似於上面的「陣列」思路設計。

回答

-1

您必須質疑原始請求。如果你使用memcache(out of process)來存儲一個像skype這樣的大型文件,你不僅會獲得更好的性能,而且速度和性能也會更低。因爲你可能知道將要放入memcache的所有內容(out of process)需要被serrial化,然後當你從緩存中讀取它時,它需要再次反序列化。每次你嘗試從一個超出進程的緩存中獲取一個1 MB的對象時,它會消耗大量的CPU來在內存中構建這個對象。在你的情況下,如果你在需要的時候將訪問加載到內存中,速度會更快。

+0

我認爲你錯過了這個問題的關鍵。這些問題特別要求我們爲Memcached設計一個包裝器,使用Memcached作爲主要數據存儲器,它應該使用從1MB到幾GB的值。 –