我得到了一个示例脚本,它看起来像这样:
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);如果我使用now
$memcache->set('var_key', 'some really big variable');当然,键get/value被存储(只在一台服务器上)。但是当我对Memcache Serverlist重新排序时,它会重新创建缓存。我注意到它总是使用第二个服务器...但是为什么呢?
我只想知道并理解存储的哈希是如何生成的。哪些因素与散列和服务器选择相关?
我找不到任何关于。
致以问候!
发布于 2013-01-12 08:37:03
答案是:
crc32($KEY) % Server.length因此,在我的例子中,我有两台服务器,示例密钥为"var_key“。
crc32('var_key') %2
结果是0。所以第一个服务器是幸运的!
crc32('var_key_bit_longer_and_longer') %2
在本例中,选择第二个服务器(结果为1)。
正如我们所见,以下因素是相关的:
(服务器的关键服务器计数和顺序)
对于标准的散列策略,这就是选择服务器的方式。
发布于 2013-01-10 00:15:40
我不确定如何实现CRC客户端库来对密钥运行hashing algorithm works,并对列表中的实例数量进行取模操作,以便从列表中为set/get选择一个实例
更好的是,您可以使用weight选项增加在50-50中选择的每个服务器的更改
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211,true,50);
$memcache->addServer('memcache_host2', 11211,true,50);发布于 2013-01-10 00:33:38
看看Cache的_hashfunc(),它使用键作为唯一的参数。
sub _hashfunc {
return (crc32($_[0]) >> 16) & 0x7fff;
}https://stackoverflow.com/questions/14223808
复制相似问题