1.使用memcache还是memcached?
参考资料
php memcache与php memcached以及遇到的问题
总的来说:
相比memcached,memcache比较老,功能简单,且有的功能不完善,错误码粒度太大,无法细致排错.因为应该使用memcached
2.memcached的安装(摘自手册)
a.这个扩展需要» libmemcached客户端库,版本大于等于 1.0.0),因此,如果没有,需要先去安装libmemcached.
b.安装时,注意:如果libmemcached被安装在一个非标准路径,使用--with-libmemcached-dir=DIR 来指定路径,DIR就是libmemcached安装时的prefix参数。这个路径需要包含文件include/libmemcached/memcached.h。
c.注意,session处理器的支持默认是开启的。如果要关闭它,使用选项--disable-memcached-session。
3..memcached的cas方法
Memcached::cas(check and set)使用了乐观锁,避免了并发访问时可能出现的覆盖修改问题.
成功时返回 TRUE
, 或者在失败时返回 FALSE
。 如果在元素尝试存储时发现在本客户端最后一次获取后被其他客户端修改,Memcached::getResultCode() 将返回Memcached::RES_DATA_EXISTS
。
以下是使用举例,使用do,while结构及cas方法,如果cas方法
$m = new Memcached (); $m -> addServer ( 'localhost' , 11211 ); do { /* 获取ip列表以及它的标记 */ $ips = $m -> get ( 'ip_block' , null , $cas ); /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回false)*/ if ( $m -> getResultCode () == Memcached :: RES_NOTFOUND ) { $ips = array( $_SERVER [ 'REMOTE_ADDR' ]); $m -> add ( 'ip_block' , $ips ); /* 其他情况下,添加ip到列表中, 并以cas方式去存储, 这样当其他客户端修改过, 则返回false */ } else { $ips [] = $_SERVER [ 'REMOTE_ADDR' ]; $m -> cas ( $cas , 'ip_block' , $ips ); } } while ( $m -> getResultCode () != Memcached :: RES_SUCCESS );