2009-07-14 2 views
15

Memcachedには、キー(250文字)と値(概ね1 MB)の長さ制限があります。あなたの意見でそれらを回避する最良の方法は何ですか?私はPerl APIキャッシュ:: Memcachedを使用します。どのようにmemcachedのキー/値の制限を回避しますか?

私は現在、元の値が大きすぎる場合( "部品番号:<>")、メインキーの値に特別な文字列を格納しています。その場合は、<> <メインキー>、2 + <メインキー>など。これは「OK」(ただし、乱雑)のように見えますが、他の人にとってはあまり良くありません。また、一部の部品が紛失してしまうという本質的な問題があります他の人を守るためにスペースが無駄になり、時間を無駄にしている)。

キーの制限に関しては、ハッシュを実装して(衝突を回避するために)フルキーを格納する可能性がありますが、まだこれを行う必要はありません。

誰かがより洗練された方法、または任意のデータサイズ(およびキー値)を透過的に扱うPerl APIを思いついた人はいますか?誰かがmemcachedサーバーをハックして任意のキー/値をサポートしていますか?

答えて

20

サーバはすでにあなたが好きなサイズを指定することができない:

-I   Override the size of each slab page. Adjusts max item size 
       (default: 1mb, min: 1k, max: 128m) 

はしかし、ほとんどの時間は、人々がより大きなオブジェクトをキャッシュするために欠けているとき、彼らは何か間違ったことをやっています。あなたは本当にその多くのデータがの1つのキャッシュキーで必要ですか?非圧縮?

タスクが十分に大きい場合は、データを実際に転送するのにかかる時間が短くて済みますが、レイテンシの低いアクセスの利点は小さくなります。あるいは、同じキーですべてを投げることは、フロントエンドが、必要とするデータをデシリアライズするために多くの作業をしなければならなくなることを意味します。

それはあなたのニーズによって異なりますし、あなたが何をしているのかをもっと知らなくても、あなたに何が最善のものかを伝えることはできません。あなたが本当に1MBを超えるものを必要としているのであれば、それで-Iを追加したのです。

0

値が大きすぎる場合、標準値(デコード時には常に辞書であった)を保存する代わりに、キーのリストを保存しました。その後、各キーのデータを読み取り、主な値を復元しました。キーが長すぎたとき(私たちのデータセットでは起こるかもしれませんが、ごくまれにしか)、キーをハッシュしたと思います。

私たちはこのコードをすべてmemcachedクライアントの上に直接書きました(私たちはPythonを使用していました)ので、上位レベルではすべて透明でした。

-2
$key=abs(crc32($long_key)) 

あなたはmemcacheのは、見ている250文字を超えた変化を有していてもよく、クエリや他の長いキーの一意のキーを取得この方法です。

+20

あなたと衝突することがあります。 –

+1

合意。 CRC32は少なくともMD5ハッシュを使用して多くの衝突を与えます。 –

9

$キー= ABS(CRC32($のlong_key))

あなたは クエリと が memcacheのは、見ている250文字を超えた変化を有していてもよく、他の長いキーの一意のキーを取得この方法です。

Whoa ...注意してください。良いアドバイスはありますが、重要な注意点はありません。それは衝突を引き起こす可能性があります。確かにそれは非常に起こりそうもないですが、地球をバラバラにするためには一度だけ起こらなければなりません。 memcachedを使用して長いキーを保存し、キーの衝突を常に再確認したいと思うでしょう。それらに対処する最善の方法は、long_key/valueのペアの単純なリストを格納することです。

+0

memcachedを使用して他の場所で保持されているデータをキャッシュする(ほとんどの)シナリオでは、衝突の可能性は、これを回避するプログラムの懸念を否定します。高衝突率のためにmemcachedを監視するだけで、問題があるかどうかを知ることができます。そして、それだけで、お互いに上書きしているキーを探して時間を割く価値があります。キャッシュストラテジが正しく実装されており、永続化されたデータをキャッシュしている場合は、バグが発生することはなく、パフォーマンスが低下するだけです。 –

+3

キャッシュする内容によって異なります。キャッシュされた情報がユーザーにとってプライベートなものである場合、ハッシュの衝突はプライベートデータの漏洩を意味する可能性があります。ハッシュの衝突確率を効果的にゼロにするハッシュがあることは認められますが、crc32はそのうちの1つではありません。ハッシュコリジョンの確率が1対2になるためには、77000をわずかに上回ります(http://preshing.com/20110504/hash-collision-probabilities)。キーのためのより良いハッシュ関数を使用すると助けますが、私が知っているすべてのハッシュテーブルの実装は、衝突の原因となります。それは厳しくない;キーを保存してチェックするだけです。 – peabody

-1

実際の最初の質問には関係しませんが、APCへの切り替えについて考える場合は、キーのlenは9727文字です。 (PHP 5.3.2でテスト済み)

関連する問題