memcached维护及其数据遍历实现
原贴:http://iceskysl.1sters.com/?action=show&id=429memcached维护及其数据遍历实现
Submitted by iceskysl on 2008, November 10, 2:52 AM. 技术归总 | Technic
http://z.alimama.com/alimamal.php?i=mm_10001645_810081_2209991&u=http%3A%2F%2Ficeskysl.1sters.com%2F%3Faction%3Dshow%26id%3D429&w=468&h=60&re=1280x800&sz=12&r=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fhl%3Dzh-CN%26q%3Dmemcached%2B%25E7%25BB%25B4%25E6%258A%25A4%26btnG%3DGoogle%2B%25E6%2590%259C%25E7%25B4%25A2%26meta%3D%26aq%3D0%26oq%3D&cg=54109eaa6717d0205a83a63ba1cdbda7&pro=83918012&cas=pro&cah=800&caw=1280&ccd=24&ctz=8&chl=1&cpl=0&cmm=0&cf=-1&sx=437&sy=181&cbw=1263&cbh=6337需要时不时的看看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
说说其实现遍历的原理:
[*]telnet到192.168.15.225(局域网测试机器)的memcache服务器;
[*]执行stats items命令,可以看到出现 很多的items行。
[*]执行stats cachedump 3 0命令。这里的3表示上面图中items后面的数字,0标示显示全部的数据,如果是1就标示只显示1条。
下图为执行后的结果,item后面的字符串为key
[*] 通过上面列出的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版
[*]#!/usr/bin/env ruby
[*]require 'socket'
[*]
[*]# stats
[*]# stats reset
[*]# stats malloc
[*]# stats maps
[*]# stats sizes
[*]# stats slabs
[*]# stats items
[*]# stats cachedump slab_id limit_num
[*]# stats detail
[*]
[*]class Memcache
[*]class << self
[*] def open(host, port)
[*] s = TCPSocket.open(host, port)
[*] yield s if block_given?
[*] ensure
[*] s.close if s
[*] end
[*]
[*] def command(command_string, s)
[*] s.send(command_string + "/r/n", 0)
[*] buff = []
[*] until ["END", "OK", "DELETE", "ERROR"].include?(line = s.gets.strip) do
[*] buff << line
[*] end
[*] buff
[*] end
[*]
[*] def exec(command_string, host = "javaeye", port = 11211)
[*] open(host, port) { |socket| command(command_string, socket).each {|line| puts line } }
[*] end
[*]
[*] def cache_stats(host = "javaeye", port = 11211)
[*] cache_objects = {}
[*] open(host, port) do |socket|
[*] slabs = []
[*] command("stats items", socket).each do |line|
[*] slab_id = line.split.split(":").to_i
[*] slabs << slab_id unless slabs.include?(slab_id)
[*] end
[*] slabs.each do |slab_id|
[*] puts "browse slab #{slab_id}..."
[*] command("stats cachedump #{slab_id} 0", socket).each do |item|
[*] key = item.split.split("/").to_s
[*] cache_objects.include?(key) ? cache_objects += 1 : cache_objects = 1
[*] end
[*] end
[*] end
[*] cache_objects.each_pair {|key, value| puts "#{key} : #{value}"}
[*] end
[*]end
[*]end
[*]
[*]if ARGV.size == 0
[*]Memcache.cache_stats
[*]else
[*]Memcache.exec(ARGV.join(" "))
[*]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)
页:
[1]