这里简单介绍一下Memcache 的用法
参考文档:关于memcache分布式一致性hash
http://www.gosoa.com.cn/%E5%85%B3%E4%BA%8Ememcache%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4%E6%80%A7hash
保存数据
my $add = $memcached->add( '键', '值', '是否压缩','期限' );//仅当存储空间中不存在键相同的数据时才保存
my $replace = $memcached->replace( '键', '值','是否压缩', '期限' );//仅当存储空间中存在键相同的数据时才保存
my $set = $memcached->set( '键', '值', '是否压缩','期限' );//与add和replace不同,无论何时都保存
获取数据
获取数据可以使用get和get_multi方法。
my $val = $memcached->get('键');
my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');一次取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键值, 其速度要比循环调用get快数十倍。
删除数据
删除数据使用delete方法,不过它有个独特的功能。
$memcached->delete('键', '阻塞时间(秒)');删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。 此功能可以用于防止缓存数据的不完整。但是要注意,set函数忽视该阻塞,照常保存数据
增一和减一操作
可以将memcached上特定的键值作为计数器使用。
my $ret = $memcached->incr('键');
$memcached->add('键', 0) unless defined $ret;增一和减一是原子操作,但未设置初始值时,不会自动赋成0。因此, 应当进行错误检查,必要时加入初始化操作。
清除所有数据
$mem->flush();
关闭连接
$mem->close();
添加多服务
memcached -m 10 -u root -d -l 127.0.0.1 -p 11212 //添加11212 端口服务(php启动不了11211端口服务,原因未知)
class MyMemcache {
private static $config = array(
'Time'=>1200,
'Host'=>'10.100.100.40',
'Port' => '11211',
'Prefix'=>'');
/**
*
* 获取Memcache对象
*/
private function getMemcache() {
static $cache = null;
if ($cache == null)
{
$cache = new Memcache ();
$cache->connect ( self::$config['Memcache'] ['Host'], self::$config['Memcache'] ['Port'] );
}
return $cache;
}
/**
*Memcache::set方法则会直接覆写已经存在的键值。
*param1 $key 键
*param2 $val 值
*return boole
*/
public function set($key, $val, $time = 0)
{
return empty ( $key )?false:self::getMemcache ()->set ( self::$config['Memcache'] ['Prefix'] . $key, $val, 0, empty($time)?self::$config['Memcache'] ['Time']:$time );
}
/**
*删除一个Memcache上的key值
*param $key 键
*return boole
*/
public function delete($key, $time = 0)
{
return empty ( $key )?false:self::getMemcache ()->delete ( self::$config['Memcache'] ['Prefix'] . $key ,$time);
}
/**
*方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。
*param1 $key 键
*param2 $val 值
*return boole
*/
public function add($key, $val, $time = 0)
{
return ( empty ( $key ) || empty ( $val ))?false:self::getMemcache ()->add ( self::$config['Memcache'] ['Prefix'] . $key,$val, empty ($time)?self::$config['Memcache'] ['Time']:$time );
}
/**
*Addserver 添加一个可供使用的服务器地址
*param1 $host 主机
*param2 $port 端口
*return boole
*/
public function addServer($host, $port)
{
return ( empty ( $host )||empty ( $port ))?false:self::getMemcache ()->addServer ( $host, $port ) or die ( "could not add Memcache Server!" );
}
/**
*SetServerParams 方法的作用是在运行时修改服务器的参数
*param1 $host 主机
*param2 $port 端口
*/
public function setServerParams($host, $port)
{
return (empty ( $host ) || empty ( $port ))?false:self::getMemcache ()->setServerParams ( $host, $port ) or die ( "couldnot Set Memcache ServerParams!" );;
}
/**
*清除所有缓存的数据,但是不会削去使用的内存空间
*/
public function flush()
{
return self::getMemcache ()->flush ();
}
/**
*方法的作用是获取一个键值
*/
public function get($key)
{
return empty ( $key )?false:self::getMemcache ()->get ( self::$config['Memcache'] ['Prefix'] . $key );
}
/**
*对一个已有的key进行覆写操作
*param1 $key 键
*param2 $val 值
*param2 $time 自动销毁的时间(可选)
*return boole
*/
public function replace($key, $val,$time=0)
{
return empty ( $key )?false:self::getMemcache ()->replace ( self::$config ['Memcache'] ['Prefix'] . $key, $val, empty($time)?self::$config['Memcache'] ['Time']:$time );
}
/**
*GetAll 获取所有缓存数据
*return Array
*/
public function getAll()
{
$list = array ();
$hp = self::$config['Memcache'] ['Host'].":".self::$config['Memcache'] ['Port'];
$items = self::getMemcache ()->getExtendedStats ( 'items' );
if(!empty($items [$hp] ['items'])&&is_array($items [$hp] ['items']))
{
foreach ( $items [$hp] ['items'] as $ik => $iv )
{
$line = self::getMemcache ()->getExtendedStats ( "cachedump", $ik, 0 );
if (!empty($line [$hp])&&is_array ( $line [$hp] ) )
{
foreach ( $line [$hp] as $k => $v )
{
$list [$k] = $this->get ( $k );
}
}
}
}
return $list;
}
/**
*以$Prefix为前缀的所有缓存数据
*注意:$Prefix不包含$WebConfig['Memcache']['Prefix']的字符串
*param String
*return Array
*/
public function getAllPrefix($Prefix = null)
{
$list = array ();
$all = $this->getAll();
foreach ($all as $k=>$v)
{
if (substr ( $k, 0, strlen ( $Prefix ) ) === $Prefix)
{
$list [$k] = $v;
}
}
return $v;
}
/**
*
* 删除带前缀的缓存
*/
public function delByPrefix($Prefix = null)
{
$all = $this->getAll();$Prefix = empty($Prefix)?self::$config['Memcache'] ['Prefix']:$Prefix;foreach ($all as $k=>$v){if (substr ( $k, 0, strlen ( $Prefix ) ) === $Prefix){if(self::getMemcache ()->delete ( $k ,0)){echo "删除缓存(".$k.")成功!</br>";}else{echo "删除缓存(".$k.")失败!</br>";}}}
}
/**
*
* 删除带前缀的缓存
*/
public function delAll()
{
$all = $this->getAll();foreach ($all as $k=>$v){if(self::getMemcache ()->delete ( $k ,0)){echo "删除缓存(".$k.")成功!</br>";}else{echo "删除缓存(".$k.")失败!</br>";}}echo "清理结束!</br>";
}
/**
*关闭Memcache
*/
public function close()
{
return self::getMemcache ()->close ();}public static function getInstance(){static $class = null;if ($class == null) {$class = new self();}return $class;
}
/**
*GetAll 获取所有缓存数据
*return Array
*/
public function getAll() {
$arr = array ();
global $WebConfig;
$hp = "{$WebConfig ['Memcache'] ['Host']}:{$WebConfig ['Memcache'] ['Port']}";
$getMemcache = self::getMemcache ();
$items = $getMemcache->getExtendedStats ( 'items' );
if(!empty($items [$hp] ['items'])&&is_array($items [$hp] ['items'])){
foreach ( $items [$hp] ['items'] as $ik => $iv ) {
$line = $getMemcache->getExtendedStats ( "cachedump", $ik, 0 );
if (!empty($line [$hp])&&is_array ( $line [$hp] ) ) {
foreach ( $line [$hp] as $k => $v ) {
$arr [$k] = $getMemcache->get ( $k );
}
}
}
}
return $arr;
}
/**
*以$Prefix为前缀的所有缓存数据
*注意:$Prefix不包含$WebConfig['Memcache']['Prefix']的字符串
*param String
*return Array
*/
public function getAllPrefix($Prefix = null) {
global $WebConfig;
$arr = array ();
if(empty($Prefix)){
$Prefix = $WebConfig ['Memcache'] ['Prefix'] ;
}
$hp = "{$WebConfig ['Memcache'] ['Host']}:{$WebConfig ['Memcache'] ['Port']}";
$getMemcache = self::getMemcache ();
$items = $getMemcache->getExtendedStats ( 'items' );
if(!empty($items [$hp] ['items'])&&is_array($items [$hp] ['items'])){
foreach ( $items [$hp] ['items'] as $ik => $iv ) {
$line = $getMemcache->getExtendedStats ( "cachedump", $ik, 0 );
if (!empty($line [$hp])&&is_array ( $line [$hp] ) ) {
foreach ( $line [$hp] as $k => $v ) {
if (substr ( $k, 0, strlen ( $Prefix ) ) === $Prefix) {
$arr [$k] = $getMemcache->get ( $k );
}
}
}
}
}
return $arr;
}
/**
*
* 删除带前缀的缓存
*/
public function flushByPrefix($Prefix = null) {
global $WebConfig;
$arr = array ();
if(empty($Prefix)){
$Prefix = $WebConfig ['Memcache'] ['Prefix'] ;
}
$hp = "{$WebConfig ['Memcache'] ['Host']}:{$WebConfig ['Memcache'] ['Port']}";
$getMemcache = self::getMemcache ();
$items = $getMemcache->getExtendedStats ( 'items' );
if(!empty($items [$hp] ['items'])&&is_array($items [$hp] ['items'])){
foreach ( $items [$hp] ['items'] as $ik => $iv ) {
$line = $getMemcache->getExtendedStats ( "cachedump", $ik, 0 );
if (!empty($line [$hp])&&is_array ( $line [$hp] ) ) {
foreach ( $line [$hp] as $k => $v ) {
if (substr ( $k, 0, strlen ( $Prefix ) ) === $Prefix) {
if($getMemcache->delete ( $k ,0)){
echo "删除缓存(".$k.")成功!</br>";
}else{
echo "删除缓存(".$k.")失败!</br>";
}
}
}
}
}
}
}
}