1

次のようなサンプル スクリプトを取得しました。

$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);

今使ったら

$memcache->set('var_key', 'some really big variable');

もちろん、キーの取得/値は保存されます (1 つのサーバーにのみ)。しかし、Memcache Serverlist を並べ替えると、キャッシュが再作成されます。常に2番目のサーバーを使用していることに気付きました...しかし、なぜですか?

ストレージのハッシュがどのように生成されるかを知り、理解したいだけです。また、ハッシュとサーバーの選択に関連する要因は何ですか?

については何も見つかりませんでした。

よろしく!

4

3 に答える 3

1

答えは次のとおりです。

crc32($KEY) % Server.length

したがって、私の場合、サンプル キー「var_key」を持つ 2 つのサーバーを取得しました。

crc32('var_key') % 2

結果は 0 です。したがって、最初のサーバーがラッキーです!

crc32('var_key_bit_longer_and_longer') % 2

この場合、2 番目のサーバー (結果は 1) が選択されます。

ご覧のとおり、次の要因が関連しています。

  • キー
  • サーバー数
  • サーバーの順序

これが、標準のハッシュ戦略のためにサーバーが選択される方法です。

于 2013-01-12T00:37:03.477 に答える
0

hashing algorithm worksキーに対してCRCを実行し、リスト内のインスタンスの数に対してモジュラスを実行して、set / getのリストからインスタンスを選択するために、クライアントライブラリを実装する方法がわかりません。

さらに良いことに、オプション50-50を使用して、選択された各サーバーの変更を増やすことができますweight

$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211,true,50);
$memcache->addServer('memcache_host2', 11211,true,50);
于 2013-01-09T16:15:40.377 に答える
0

Cache::Memcached の_hashfunc()を見てください。唯一のパラメータとしてキーを使用しています。

sub _hashfunc {
    return (crc32($_[0]) >> 16) & 0x7fff;
}
于 2013-01-09T16:33:38.210 に答える