Memcache哈希生成

时间:2013-01-08 20:53:43

标签: php hash memcached

我得到了一个看起来像这样的脚本示例:

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

如果我现在使用

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

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

我只想知道并了解如何生成存储的哈希值。 哪些因素与哈希和服务器选择有关?

我找不到任何关于。

问候!

3 个答案:

答案 0 :(得分:1)

答案是:

crc32($KEY) % Server.length

所以在我的情况下,我有两个带有Sample键“var_key”的服务器。

  

crc32('var_key')%2

     

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

     

crc32('var_key_bit_longer_and_longer')%2

     

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

我们可以看到,以下因素是相关的:

  • The Key
  • 服务器计数
  • 服务器顺序

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

答案 1 :(得分: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);

答案 2 :(得分:0)

查看Cache :: Memcached的_hashfunc(),它使用密钥作为唯一参数。

sub _hashfunc {
    return (crc32($_[0]) >> 16) & 0x7fff;
}