memcached分布式解决方案

memcache缓存是缓存数据库查询结果减轻数据库压力。这里不探讨memcache如何使用。

很多时候一台memcached服务器不能满足需求,就需要多台memcached服务器。但是用了多台服务器,程序怎么知道把数据存储到哪台服务器,又怎么知道去哪台服务器读取数据呢?

我在书上找到两种解决方案普通的hash分布和一致性的hash分布,贴出来跟大家一起分享一下。如果有更好的,赶紧贴出来,与大家一起分享一下。

普通的hash分布:

 

function hashKey($key){
    $md5 = substr(md5($key), 0, 8);
    $seed = 31;
    $hash = 0;

    for($i = 0; $i < 8; $i++){
        $hash = $hash * $seed + ord($md5{$i});
        $i++;
    }

    return $hash & 0x7FFFFFFF;
}

$servers = array(
    array("host" => "192.168.1.101", "port" => 6397),
    array("host" => "192.168.1.102", "port" => 6397),
);

$key = "dataKey";

$memcacheServer = $servers[hashKey($key) % 2];
print_r($memcacheServer);

在这里就输出了,我们想要的服务器了。然后在跟memcache去交互。

一致性的hash分布:

在memcache服务器不多的时候,普通的hash可以运作很好。但是在增加一台服务器,同一个key经过hash,就会出问题。我们原来的缓存,都找不到了。这时候,我们可以使用一致性的hash。

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>