简单分析了一下使用memcache的PHP客户端向多个memcache服务器请求多个key的情况:
PHP程序代码:
<?php
$mc=new Memcache();
$mc->addServer(“localhost”,11211);
$mc->addServer(“localhost”,11212);
for($i=0;$i<10;$i++)
{
//$mc->set($i,1);
$k[]=$i;
}
$r=$mc->get($k);
var_dump($r);
?>
使用freebsd下的truss工具窥探一下系统调用(只截取了主要部分):
socket(PF_INET,SOCK_STREAM,0) = 4 (0×4)
fcntl(4,F_GETFL,) = 2 (0×2)
fcntl(4,F_SETFL,O_NONBLOCK|0×2) = 0 (0×0)
connect(4,{ AF_INET 127.0.0.1:11212 },16) = 0 (0×0) //连接11212端口的memcache实例
fcntl(4,F_SETFL,0×2) = 0 (0×0)
fcntl(4,F_GETFL,) = 2 (0×2)
fcntl(4,F_SETFL,O_NONBLOCK|0×2) = 0 (0×0)
stat(“/etc/nsswitch.conf”,{mode=-rw-r–r– ,inode=49560,size=313,blksize=4096}) = 0 (0×0)
open(“/etc/hosts”,O_RDONLY,0666) = 5 (0×5)
fstat(5,{mode=-rw-r–r– ,inode=49684,size=1365,blksize=4096}) = 0 (0×0)
read(5,”# $FreeBSD: src/etc/hosts,v 1.16″…,4096) = 1365 (0×555)
read(5,0x28f5f000,4096) = 0 (0×0)
close(5) = 0 (0×0)
gettimeofday({1242119085.285712},0×0) = 0 (0×0)
socket(PF_INET,SOCK_STREAM,0) = 5 (0×5)
fcntl(5,F_GETFL,) = 2 (0×2)
fcntl(5,F_SETFL,O_NONBLOCK|0×2) = 0 (0×0)
connect(5,{ AF_INET 127.0.0.1:11211 },16) = 0 (0×0) //连接11211端口的memcache实例
fcntl(5,F_SETFL,0×2) = 0 (0×0)
fcntl(5,F_GETFL,) = 2 (0×2)
fcntl(5,F_SETFL,O_NONBLOCK|0×2) = 0 (0×0)
select(6,{4 5},{4 5},0×0,{1.000000}) = 2 (0×2) //使用select来判断是否可以发送数据
sendto(4,”get 0 1 3 7 8\r\n”,15,0×20000,NULL,0×0) = 15 (0xf)
sendto(5,”get 2 4 5 6 9\r\n”,15,0×20000,NULL,0×0) = 15 (0xf)
select(6,{4 5},{},0×0,{1.000000}) = 2 (0×2) //使用select来判断是否可以接收数据
recvfrom(4,”VALUE 0 768 1\r\n1\r\nVALUE 1 76″…,32768,0×0,NULL,0×0) = 95 (0x5f)
recvfrom(5,”VALUE 2 768 1\r\n1\r\nVALUE 4 76″…,32768,0×0,NULL,0×0) = 95 (0x5f)
通过以上可以看出:
1,PHP会根据自己的HASH规则,将传入的一组key拆分为两组,然后分别发送到对应的memcache服务器上。
2,PHP使用select来判断两个请求是否可以读写,基本可以认为是并行读写的。
3,我觉得这样的做法很好,比起自己一个一个读要好的多。