memcached维护及其数据遍历实现

来源:互联网 发布:3年c#转java 编辑:程序博客网 时间:2024/05/21 15:44

原贴:http://iceskysl.1sters.com/?action=show&id=429

memcached维护及其数据遍历实现

需要时不时的看看memcached的状态,其自身只提供了get、set等方法啊我们需要使用其提供的方法遍历一下其缓存的内容,其原理请参考《如何对memcache的数据(key-value)进行遍历操作 》和《贴一段遍历memcached缓存对象的小脚本》。

memcache的stats命令包括:

1.        stats 
2.        stats reset 
3.        stats malloc 
4.        stats maps 
5.        stats sizes 
6.        stats slabs 
7.        stats items 
8.        stats cachedump slab_id limit_num 
9.        stats detail [on|off|dump]

说说其实现遍历的原理:

  1. telnet到192.168.15.225(局域网测试机器)的memcache服务器;
  2. 执行stats items命令,可以看到出现 很多的items行。
  3. 执行stats cachedump 3 0命令。这里的3表示上面图中items后面的数字,0标示显示全部的数据,如果是1就标示只显示1条。
    下图为执行后的结果,item后面的字符串为key
  4.  通过上面列出的key我们就可以遍历所有的数据了,下面我们取出某一条数据,key为Uc!uLh的数据。

来两个遍历的代码:
1、PHP版

1.        <?php

2.        $host='192.168.15.225';

3.        $port=11211;

4.        $mem=new Memcache();

5.        $mem->connect($host,$port);

6.        $items=$mem->getExtendedStats (‘items’);

7.        $items=$items["$host:$port"]['items'];

8.        for($i=0,$len=count($items);$i<$len;$i++){

9.            $number=$items[$i]['number'];

10.         $str=$mem->getExtendedStats ("cachedump",$number,0);

11.         $line=$str["$host:$port"];

12.         if( is_array($line) && count($line)>0){

13.             foreach($line as $key=>$value){

14.                 echo $key.'=>';

15.                 print_r($mem->get($key));

16.                 echo "/r/n";

17.             }

18.         }

19.     }

20.     ?>

2、RUby版

  1. #!/usr/bin/env ruby  
  2. require 'socket'  
  3.   
  4. # stats  
  5. # stats reset  
  6. # stats malloc  
  7. # stats maps  
  8. # stats sizes  
  9. # stats slabs  
  10. # stats items  
  11. # stats cachedump slab_id limit_num  
  12. # stats detail [on|off|dump]  
  13.   
  14. class Memcache  
  15.   class << self  
  16.     def open(host, port)  
  17.       s = TCPSocket.open(host, port)  
  18.       yield s if block_given?  
  19.     ensure  
  20.       s.close if s  
  21.     end  
  22.     
  23.     def command(command_string, s)  
  24.       s.send(command_string + "/r/n", 0)  
  25.       buff = []  
  26.       until ["END""OK""DELETE""ERROR"].include?(line = s.gets.strip) do  
  27.         buff << line   
  28.       end  
  29.       buff  
  30.     end  
  31.     
  32.     def exec(command_string, host = "javaeye", port = 11211)  
  33.       open(host, port) { |socket| command(command_string, socket).each {|line| puts line } }  
  34.     end  
  35.       
  36.     def cache_stats(host = "javaeye", port = 11211)  
  37.       cache_objects = {}  
  38.       open(host, port) do |socket|  
  39.         slabs = []  
  40.         command("stats items", socket).each do |line|  
  41.           slab_id = line.split[1].split(":")[1].to_i  
  42.           slabs << slab_id unless slabs.include?(slab_id)  
  43.         end  
  44.         slabs.each do |slab_id|  
  45.           puts "browse slab #{slab_id}..."  
  46.           command("stats cachedump #{slab_id} 0", socket).each do |item|  
  47.             key = item.split[1].split("/")[0].to_s  
  48.             cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 1  
  49.           end  
  50.         end  
  51.       end  
  52.       cache_objects.each_pair {|key, value| puts "#{key} : #{value}"}  
  53.     end  
  54.   end  
  55. end  
  56.   
  57. if ARGV.size == 0  
  58.   Memcache.cache_stats  
  59. else  
  60.   Memcache.exec(ARGV.join(" "))  
  61. end 

Tags: memcached

« 上一篇 | 下一篇 »

我的推荐:支持RubyOnRails服务器

考虑到很多朋友来信要我推荐好的Rails空间和优惠码,如果你正在找寻支持Rails的空间,不妨试试我使用过的这两款.
1.SliceHost(生产系统性价比最高)
SliceHost是一家很棒的VPS服务商提供诸如Ubuntu、CentOS、Debian 4.0、Fedora9、Gentoo好几种系统发行版选择,可以选择256M、512M、1G等好几种方案,拥有root权限,完全自主,非常稳定且价格在VPS中是最便宜的,适合做生产环境,极力推荐。
如果你感兴趣,按照如下两个方式得到最大优惠:
1.点击优惠的SliceHost过去注册;
2.注册时“Referral email address”输入"iceskysl@gmail.com"即可。

只显示8条记录相关文章

I hate hardcode configs in plugins like cache_fu (浏览: 71, 评论: 0)
Rails+Memcached,跑起来嗖嗖的 (浏览: 1615, 评论: 1)