MemCache-clientラッパークラス案

とりあえず複数のサーバーと接続しているときにサーバーの切断を自動検出してくれないので(memcache-client 1.5.0の場合)、ラッパークラス案を考えてみた。

とりあえず最低限のメソッド(入れると出すだけ)を入れてテスト。

 require "rubygems"
 require "memcache"
 
 class AdvMemCached
   class AdvMemCachedError < StandardError; end
   attr_accessor :server_num
   
   def initialize(*args)
     args[1] = {} if nil == args[1]
     @mem = MemCache.new(args[0],args[1])
     @server_num = @mem.servers.size
   end
   def get(key)
     begin
       return @mem.get(key)
     rescue MemCache::MemCacheError
       self.re_connection
       self.get(key)
     end
   end
   alias  get
   
   def set(key,value)
     begin
       @mem[key] = value
     rescue MemCache::MemCacheError
       self.re_connection
       self.set(key,value)
     end
   end
   def =(key,value)
     self.set(key,value)
   end
   
   def re_connection
     doc =  @mem.servers.find_all{|sv| true == sv.alive?}
     #もう接続先が無い
     if 0 == doc.size
       raise AdvMemCachedError,"No MemCached Server is Alive"
     else
       @server_num = doc.size
     end
     @mem.servers = []
     doc.each do |i|
        @mem.servers << i
     end
   end
 end

これで昨日のバグ対応も組み込んだ形でラッパークラスの元になるかな。

 require "./admemcache.rb"
 cache = AdvMemCached.new(["192.168.0.1","192.168.0.2"])
 while(true) do
   ran = rand(99999).to_s
   cache["data"+ran] = 22
   p cache.server_num
 end

このサンプルを走らせてテストすると途中でmemcachedサーバーを停止させるとserver_numの数が変更になるもののそのままがんばって継続しているのが見える。

0個になるとraiseがあがってくるのでそこで止まる算段。

まあ、これで個数が変化したときにログでも出力できる機能をつけておけば十分か。もうちょい拡張して自分用に置いておこう。そのうち使うこともあるだろう。