原贴:http://iceskysl.1sters.com/?action=show&id=429
memcached维护及其数据遍历实现
Submitted by iceskysl on 2008, November 10, 2:52 AM. 技术归总 | Technic
<script type="text/JavaScript"> alimama_pid="mm_10001645_810081_2209991"; alimama_titlecolor="535353"; alimama_descolor ="313131"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="FFFFFF"; alimama_linkcolor="4281BB"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="8"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="12"; alimama_width=468; alimama_height=60; alimama_type=2; </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"> </script> 需要时不时的看看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版
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 [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
我的推荐:支持RubyOnRails服务器
1.SliceHost(生产系统性价比最高)
SliceHost是一家很棒的VPS服务商提供诸如Ubuntu、CentOS、Debian 4.0、Fedora 9、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)