原贴:http://iceskysl.1sters.com/?action=show&id=429
memcached维护及其数据遍历实现
Submitted by iceskysl on 2008, November 10, 2:52 AM. 技术归总 | Technic
需要时不时的看看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]
说说其实现遍历的原理:
- 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版
2. $host='192.168.15.225';
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){
15. print_r($mem->get($key));
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 [on|off|dump]
-
- 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[1].split(":")[1].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[1].split("/")[0].to_s
- cache_objects.include?(key) ? cache_objects[key] += 1 : cache_objects[key] = 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)
|