Ruby / Memcached キーの一覧を取得する

最近memcachedを仕事で使いはじめたので、勉強がてらmemcache-client拡張を書いてみました。保存されているアイテムの一覧を取得するメソッド、dump_all_itemsです。

デバッグの用途はもちろんですが、初心者にとってはmemcachedのデータ構造を確認することで、仕組み理解する手助けになるかと思います。

irbを起動して、以下のコードをコピペしてください。(要memcache-client)

require 'rubygems'
require 'memcache'
# dump all items
MemCache.class_eval do
  def dump_all_items
    raise MemCacheError, "No active servers" unless active?
    server_items = {}
 
    @servers.each do |server|
      sock = server.socket
      raise MemCacheError, "No connection to server" if sock.nil?
 
      begin
        sock.write "stats items\r\n"
        items = {}
        items_dump = {}
        while line = sock.gets do
          break if line == "END\r\n"
          if line =~ /^STAT items:(\d+):number ([\w\.\:]+)/ then
            items[$1] = $2.chomp
          end
        end
        items.each do |k,v|
          sock.write "stats cachedump #{k} #{v}\r\n"
          while line = sock.gets do
            break if line == "END\r\n"
            if line =~ /^ITEM ([\w:]+) (.+)/ then
              items_dump[$1] = $2.chomp
            end
          end
        end
        server_items["#{server.host}:#{server.port}"] = items_dump
      rescue SocketError, SystemCallError, IOError => err
        server.close
        raise MemCacheError, err.message
      end
    end
 
    server_items
  end
end

で以下のようなコードを実行すると、指定したMemcachedサーバが保持している情報をHashとして取得でき、キャッシュ内容を確認することができます。こりゃ便利だ。

m = MemCache.new('localhost:11211')
m.dump_all_items

※参考にさせていただいたページ:memcachedの内容を確認するには


この記事について