2016-10-05 6 views
2

最近Skypeインタビューの15分の部分にこのようなラッパーをデザインするように求められましたが、ここに私のデザインがあります。私はこのデザインにもっと多くの情報を受け取り、それを設計するより良い方法があれば願っています。memcachedのラッパーを設計して、1MBを超える値を許可する方法はありますか?

要件: Memcachedの値の任意のサイズをサポートするMemcachedのキー値ストアラッパー(他のデータ構造はありません)。

提案

  1. データ構造:同じmemcachedの

  2. set(key, value):場合は、入力されたキーがmemlarge

    • チェックsizeOf(value)場合> 1メガバイトであると言いますはい、スプライtの値を1MBのサイズの複数のバイナリに変換し、それぞれsetをmemcachedに格納します。次のようなキースキームを使用します。

    • キーの固定サイズのハッシュコードを計算します。 )md5を使用します。memlarge-1memlarge-2、...、memlarge-n、結果はABCDEFGHI

    • は、これらの固定サイズのハッシュコードを連結し、元のキーの値として保存し、サフィックスを追加するとなりますと言います接頭辞を付けて、getメソッドが他の値をキー配列として誤って解釈しないようにします。だから今memlargeが値prefixABCDEFGHIsuffixでキャッシュされている、すなわちget('memlarge')は最初
  3. get(key)(以下、より多くの)prefixABCDEFGHIsuffixを返します。

    • チェック結果が配列のための接頭辞と接尾辞を持っている場合

    • この場合、次のget操作を実行して、値を区切って元の値を取得しますでも

      1. :質問をフォローアップ、>get('ABC'), get('DEF'), get('GHI')、最終的にユーザーに提案の

批判を返すように値に参加 - ハッシュコードによってのサイズを知ります接尾辞と接頭辞では、ランダムに保存された値に接尾辞&という接頭辞が付いている(非常に小さい)可能性がまだあります。修正は、接頭辞/接尾辞とチェックサム(md5)を省略した後の残りの値の長さチェックです。

  • 値のサイズが4MBの場合は、5 getの操作が必要です。それを4に減らす方法はありますか?

    私はこれを解決するには、リンクされたリストのアイデアを使用すると思いますが、ビット/バイトレベルの実装です。値チャンクは1MBの制限の前に終了し、別の「get(次のノード)」が必要な「信号」のためのスペースを節約します。信号は、上記の「アレイ」アイデアと同様にデザインすることができます。

  • 答えて

    -1

    元のリクエストには質問する必要があります。 memcache(プロセス外)を使用してインタビューのように大きなファイルを保存すると、パフォーマンスは向上するだけでなく、速度とパフォーマンスも低下します。あなたがmemcacheの中に入れようとしているものすべて(プロセス外)をserrializedする必要があることを知っているかもしれないので、あなたがキャッシュからそれを読むとき、再び逆直列化する必要があるからです。アウトオブプロセスキャッシュから1 MBのオブジェクトを取得しようとするたびに、メモリ内にそのオブジェクトを構築するために重要なCPUを消費します。必要に応じていつでもインタビューをメモリにロードすると、はるかに高速です。

    +0

    私はあなたが質問のポイントを見逃していると思います。質問では、主にMemcachedをプライマリデータストレージとして使用してMemcachedのラッパーを設計することを尋ねています.1MB以上の値から少しでも大きな値で動作するはずです。 –

    関連する問題