最近Skypeインタビューの15分の部分にこのようなラッパーをデザインするように求められましたが、ここに私のデザインがあります。私はこのデザインにもっと多くの情報を受け取り、それを設計するより良い方法があれば願っています。memcachedのラッパーを設計して、1MBを超える値を許可する方法はありますか?
要件: Memcachedの値の任意のサイズをサポートするMemcachedのキー値ストアラッパー(他のデータ構造はありません)。
提案:
データ構造:同じmemcachedの
set(key, value)
:場合は、入力されたキーがmemlarge
チェック
sizeOf(value)
場合> 1メガバイトであると言いますはい、スプライtの値を1MBのサイズの複数のバイナリに変換し、それぞれset
をmemcachedに格納します。次のようなキースキームを使用します。キーの固定サイズのハッシュコードを計算します。 )
md5
を使用します。memlarge-1
、memlarge-2
、...、memlarge-n
、結果はABC
、DEF
、GHI
- は、これらの固定サイズのハッシュコードを連結し、元のキーの値として保存し、サフィックスを追加するとなりますと言います接頭辞を付けて、
get
メソッドが他の値をキー配列として誤って解釈しないようにします。だから今memlarge
が値prefixABCDEFGHIsuffix
でキャッシュされている、すなわちget('memlarge')
は最初
get(key)
(以下、より多くの)prefixABCDEFGHIsuffix
を返します。チェック結果が配列のための接頭辞と接尾辞を持っている場合
この場合、次の
get
操作を実行して、値を区切って元の値を取得しますでも:質問をフォローアップ、>
get('ABC'), get('DEF'), get('GHI')
、最終的にユーザーに提案の
批判を返すように値に参加 - ハッシュコードによってのサイズを知ります接尾辞と接頭辞では、ランダムに保存された値に接尾辞&という接頭辞が付いている(非常に小さい)可能性がまだあります。修正は、接頭辞/接尾辞とチェックサム(md5)を省略した後の残りの値の長さチェックです。
値のサイズが4MBの場合は、5 get
の操作が必要です。それを4に減らす方法はありますか?
私はこれを解決するには、リンクされたリストのアイデアを使用すると思いますが、ビット/バイトレベルの実装です。値チャンクは1MBの制限の前に終了し、別の「get
(次のノード)」が必要な「信号」のためのスペースを節約します。信号は、上記の「アレイ」アイデアと同様にデザインすることができます。
私はあなたが質問のポイントを見逃していると思います。質問では、主にMemcachedをプライマリデータストレージとして使用してMemcachedのラッパーを設計することを尋ねています.1MB以上の値から少しでも大きな値で動作するはずです。 –