2023拉

memcache里的hash算法

上一篇 / 下一篇  2012-08-21 11:18:59 / 个人分类:性能测试

   Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像视频文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。   Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。   Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
    http://baike.baidu.com/view/1193094.htm

   我们知道在分布式存储时一定会用到多台机器节点分配,这个时候总体上有两种策略:1通过hash散列算法把数据尽可能均匀的分配到已知的节点里去,2通过全局表自然增长的数据方式来实现。其中全局表的方式不用表述,hash表的方法相对来说较有意思,

memcache的client端原生实现是perl Hash,这里只有php版的实现:

function hashfunc ($key)
{
$hash = 0;
for ($i=0; $i<strlen($key); $i++)
{
$hash = $hash*33 + ord($key[$i]);
}

return $hash;
}
另外在php的客户端里还有一种比较简单的crc32的方法:
sprintf("%u",crc32($key));
今天搜东东的时候偶然发现了有人在memcached的mail list 里给了另一种据说分布更均匀效率更高的算法貌似不错,memcache不用自己别的地方倒是可以试试。
用的是位移的方法:
(crc32($key)>>16)&0x7fff;
按照作者的测试这个方式的分布概率和效率都比perl Hash要好,原文:

http://lists.danga.com/pipermail/memcached/2004-June/000664.html



TAG:

 

评分:0

我来说两句

Open Toolbar