贴一段遍历memcached缓存对象的小脚本

关键字: memcached
memcached因为性能的缘故,没有提供遍历整个缓存当中对象的功能,不过memcached也提供了很多命令来监控memcached的状态,例如stats命令就有:

Ruby代码 复制代码
  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]  


不一一详细解释了,比较有价值的是stats items和stats cachedump,以及stats detail dump这几个命令,用前两条命令,实际上我们可以遍历整个memcached缓存(尽管效率低下),后一条命令则可以显示最近memcached当中对缓存对象的详细操作情况。

因为我想详细了解一下JavaEye在线运行的memcached服务器当中缓存对象的详细情况,所以花了几十分钟用ruby写了一个小脚本,用来方便的统计缓存对象,此外它还可以让你方便的发送stats命令。用法很简单:

1、统计memcached server当中的对象:

./memcached.rb

输出的结果大致是这样的:

Java代码 复制代码
  1. Problem : 4564  
  2. GroupPost : 5643  
  3. User : 27133  
  4. Group : 144  
  5. ...   
  6. Post : 44442  
  7. PostText : 255286  
  8. ......   
  9. views : 36260  
  10. Forum : 27  
  11. Category : 15065  

可以告诉你每个对象缓存的确切数量,比方说PostText被缓存了25万个对象,页面被缓存了3.6万个。这个统计方法是根据Rails内置的Cache生成的key做的解析,也许你要根据自己的应用调整一下解析代码。

2、统计memcached的对象和对象的大小

./memcached.rb stats sizes

3、监控memcached的缓存操作情况
./memcached.rb stats detail on
./memcached.rb stats detail dump
./memcached.rb stats detail off

以下是该脚本的源代码,写的很粗糙。

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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值