近来一直对memcache的telnet使用方法有些苦恼,不明白其中的一些参数代表什么意思,查询很多资料,终于搞明白了一些,另外还学习了PHP遍历memcache的方法,但由于我们很多服务器都加载cookie的加密扩展,很多的键值都是MD5加密,不过对于没有加密的服务器还是有些用处的。总结如下:
一,telnet请求命令格式
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
1,<command name> 可以是”set”, “add”, “replace”。
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败
2,<key> 客户端需要保存数据的key。
3,<flags> 是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
4,<exptime> 过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
5,<bytes> 需要存储的字节数(不包含最后的”\r\n”),当用户希望存储空数据时,<bytes>可以为0
6,“STORED\r\n”:表示存储成功 .“NOT_STORED\r\n”:表示存储失败,但是该失败不是由于错误。
例:set key 0 8 4
输入:zhao
说明:键是key ,0 为flags , 8 为过期时间8秒,4 为值的长度 ,zhao为键的值
stats items 列出所有的items
stats items
STAT items:1:number 220
STAT items:1:age 83095
STAT items:2:number 7
STAT items:2:age 1405
[...]
END
stats cachedump 1 0 //列出所有的key,1为items:1,这个值,0为所有,也可指定列出多少条
stats cachedump 1 0
ITEM key1 [8 b; 1331609364 s]
ITEM key2 [8 b; 1331609364 s]
get key 列出key的值
get key1
VALUE key1 0 8
zhangyan
二,通过PHP,遍历所有键值
<?php
/*
* 首先连接到memcache,列出所有的ITEMS
* 然后将ITEMS下的KEY列出来,进行遍历,将值输出
*/
$host = '192...43';
$port = 11211;
$mem = new Memcache();
$mem->connect($host,$port);
$items=$mem->getExtendedStats ('items');
$items=$items["$host:$port"]['items'];//列出所有的ITEMS项目
for ($i=1,$len=count($items);$i<=$len;$i++)
{
//$number=$items[$i]['number'];
$str=$mem->getextendedstats("cachedump",$i,0);//输出每个ITEMS下的KEY
//var_dump($str);
$line=$str["$host:$port"];
if (is_array($line)&&count($line)>0)
{
foreach($line as $key =>$value){
echo $key.'--';
print_r($mem->get($key));
echo "\r\n";
}
}
}
?>
一,telnet请求命令格式
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
1,<command name> 可以是”set”, “add”, “replace”。
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败
2,<key> 客户端需要保存数据的key。
3,<flags> 是一个16位的无符号的整数(以十进制的方式表示)。
该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
4,<exptime> 过期的时间。
若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。
如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
5,<bytes> 需要存储的字节数(不包含最后的”\r\n”),当用户希望存储空数据时,<bytes>可以为0
6,“STORED\r\n”:表示存储成功 .“NOT_STORED\r\n”:表示存储失败,但是该失败不是由于错误。
例:set key 0 8 4
输入:zhao
说明:键是key ,0 为flags , 8 为过期时间8秒,4 为值的长度 ,zhao为键的值
stats items 列出所有的items
stats items
STAT items:1:number 220
STAT items:1:age 83095
STAT items:2:number 7
STAT items:2:age 1405
[...]
END
stats cachedump 1 0 //列出所有的key,1为items:1,这个值,0为所有,也可指定列出多少条
stats cachedump 1 0
ITEM key1 [8 b; 1331609364 s]
ITEM key2 [8 b; 1331609364 s]
get key 列出key的值
get key1
VALUE key1 0 8
zhangyan
二,通过PHP,遍历所有键值
<?php
/*
* 首先连接到memcache,列出所有的ITEMS
* 然后将ITEMS下的KEY列出来,进行遍历,将值输出
*/
$host = '192...43';
$port = 11211;
$mem = new Memcache();
$mem->connect($host,$port);
$items=$mem->getExtendedStats ('items');
$items=$items["$host:$port"]['items'];//列出所有的ITEMS项目
for ($i=1,$len=count($items);$i<=$len;$i++)
{
//$number=$items[$i]['number'];
$str=$mem->getextendedstats("cachedump",$i,0);//输出每个ITEMS下的KEY
//var_dump($str);
$line=$str["$host:$port"];
if (is_array($line)&&count($line)>0)
{
foreach($line as $key =>$value){
echo $key.'--';
print_r($mem->get($key));
echo "\r\n";
}
}
}
?>