1

我得到了一个示例脚本,它看起来几乎像这样:

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

如果我现在使用

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

当然,密钥获取/值被存储(仅在一台服务器上)。但是当我重新排序 Memcache Serverlist 时,它会重新创建缓存。我注意到它总是使用第二个服务器...但是为什么呢?

我只想知道和理解,存储哈希是如何生成的。哪些因素与哈希和服务器选择相关?

我找不到任何关于。

问候!

4

3 回答 3

1

答案是:

crc32($KEY) % Server.length

所以在我的情况下,我得到了 2 台带有示例密钥“var_key”的服务器。

crc32('var_key') % 2

结果是0。所以第一个服务器是幸运的!

crc32('var_key_bit_longer_and_longer') % 2

在这种情况下,第二个服务器(结果为 1)被选中。

正如我们所看到的,以下因素是相关的:

  • 钥匙
  • 服务器数量
  • 服务器顺序

对于标准哈希策略,这就是选择服务器的方式。

于 2013-01-12T00:37:03.477 回答
0

我不确定如何实现hashing algorithm works客户端库以在密钥上运行 CRC 并对列表中的实例数进行取模以从列表中选择一个实例用于设置/获取

更好的是,您可以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 回答