memcached深度分析(6)

发表于:2015-07-10来源:uml.org.cn作者:火龙果软件点击数: 标签:数据库
修改 slabs_clsid 函数,让它直接返回一个定值(比如 1 ): unsigned int slabs_clsid(size_t size) { return 1;} 修改slabs_init函数,去掉循环创建所有classid属性的部分,直接

  修改 slabs_clsid 函数,让它直接返回一个定值(比如 1 ):

unsigned int slabs_clsid(size_t size) {
        return 1;
}

  修改slabs_init函数,去掉循环创建所有classid属性的部分,直接添加slabclass[1]:

slabclass[1].size = 200;                //每chunk200字节
slabclass[1].perslab = 5000;        //1000000/200

  Memcached客户端

  Memcached是一个服务程序,使用的时候可以根据它的协议,连接到memcached服务器上,发送命令给服务进程,就可以操作上面的数据。为了方便使用,memcached有很多个客户端程序可以使用,对应于各种语言,有各种语言的客户端。基于C语言的有libmemcache、APR_Memcache;基于Perl的有Cache::Memcached;另外还有Python、Ruby、Java、C#等语言的支持。PHP的客户端是最多的,不光有mcache和PECL memcache两个扩展,还有大把的由PHP编写的封装类,下面介绍一下在PHP中使用memcached的方法:

  mcache扩展是基于libmemcache再封装的。libmemcache一直没有发布stable版本,目前版本是1.4.0-rc2,可以在这里找到。libmemcache有一个很不好的特性,就是会向stderr写很多错误信息,一般的,作为lib使用的时候,stderr一般都会被定向到其它地方,比如Apache的错误日志,而且libmemcache会自杀,可能会导致异常,不过它的性能还是很好的。

  mcache扩展最后更新到1.2.0-beta10,作者大概是离职了,不光停止更新,连网站也打不开了(~_~),只能到其它地方去获取这个不负责的扩展了。解压后安装方法如常:phpize & configure & make & make install,一定要先安装libmemcache。使用这个扩展很简单:

<?php
$mc = memcache();    // 创建一个memcache连接对象,注意这里不是用new!
$mc->add_server('localhost', 11211);    // 添加一个服务进程
$mc->add_server('localhost', 11212);    // 添加第二个服务进程
$mc->set('key1', 'Hello');    // 写入key1 => Hello
$mc->set('key2', 'World', 10);    // 写入key2 => World,10秒过期
$mc->set('arr1', array('Hello', 'World'));    // 写入一个数组
$key1 = $mc->get('key1');    // 获取'key1'的值,赋给$key1
$key2 = $mc->get('key2');    // 获取'key2'的值,赋给$key2,如果超过10秒,就取不到了
$arr1 = $mc->get('arr1');    // 获取'arr1'数组
$mc->delete('arr1');    // 删除'arr1'
$mc->flush_all();    // 删掉所有数据
$stats = $mc->stats();    // 获取服务器信息
var_dump($stats);    // 服务器信息是一个数组
?>

  这个扩展的好处是可以很方便地实现分布式存储和负载均衡,因为它可以添加多个服务地址,数据在保存的时候是会根据hash结果定位到某台服务器上的,这也是libmemcache的特性。libmemcache支持集中hash方式,包括CRC32、ELF和Perl hash。

  PECL memcache是PECL发布的扩展,目前最新版本是2.1.0,可以在pecl网站得到。memcache扩展的使用方法可以在新一些的PHP手册中找到,它和mcache很像,真的很像:

<?php
 
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
 
$version = $memcache->getVersion();
echo "Server's version: ".$version."n";
 
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
 
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)n";
 
$get_result = $memcache->get('key');
echo "Data from the cache:n";
 
var_dump($get_result);
 
?>

原文转自:http://www.uml.org.cn/sjjm/201411134.asp