我被要求在最近的一次Skype採訪的15分鐘內設計這樣的包裝,這是我的設計。我希望能夠在這個設計中獲得更多的意見,並且如果有更好的設計方法。如何設計memcached的包裝以允許大於1MB的值?
要求: Memcached(沒有任何其他數據結構)支持任意大小的值輸入的鍵值存儲包裝,因爲Memcached在值存儲上限制爲1MB。
提案:
數據結構:相同的分佈式緩存
set(key, value)
:說輸入鍵是memlarge
檢查
sizeOf(value)
> 1MB,如果是的,spli將這些值轉換成多個二進制文件,每個二進制文件的大小分別爲1MB和set
,其密鑰方案如下:計算密鑰的固定大小哈希碼(例如,使用
md5
):memlarge-1
,memlarge-2
,...,memlarge-n
,說結果會ABC
,DEF
,GHI
- 串聯這些固定大小的散列碼,並將其保存爲原來的鍵值,添加後綴和前綴以防止
get
方法將其他值錯誤地解釋爲一組鍵。所以,現在memlarge
緩存與價值prefixABCDEFGHIsuffix
,即get('memlarge')
將先返回prefixABCDEFGHIsuffix
(當時下文)
get(key)
:檢查結果有陣
前綴和後綴如果是,則執行後續的
get
操作,通過定界值來獲取原始值由哈希代碼知道大小 - >get('ABC'), get('DEF'), get('GHI')
,並最終加入了價值返回給用戶
批判的建議,跟進的問題:
即使帶有後綴和前綴的情況下,隨機保存的值仍有一個(非常小的)前綴後綴&的機會。然後,修正後將省略前綴/後綴和校驗和(md5)之後的剩餘值的長度檢查。
值大小4MB將需要5
get
操作。有沒有辦法將它減少到4?我認爲一個解決方案將使用鏈表的想法,但在一個位/字節級的實現。值塊將在1MB限制之前結束,以節省「信號」的空間,這需要另一個
get
(下一個節點)。那麼信號可以類似於上面的「陣列」思路設計。
我認爲你錯過了這個問題的關鍵。這些問題特別要求我們爲Memcached設計一個包裝器,使用Memcached作爲主要數據存儲器,它應該使用從1MB到幾GB的值。 –