memcached

なんとなくmemcachedっていうのが試してみたくなったので試すことにした。

$ sudo aptitude install memcached
$ gem install memcache-client
$ sudo gem install memcache-client

詳しい使い方は全然調べてないのだけど、要はハッシュデーモン?
ホストとポートで初期化するハッシュみたいな。

require 'rubygems'
require 'memcache'

h = MemCache::new('localhost:11211')
p h["key"]

ただし普通のハッシュは普通にプロセスと寿命を共にするけど
memcachedはデーモンだからデーモンと寿命を共にする。


ついでにファイルにキャッシュする仕組みを作ってみた。
finalizerとか始めて使った気がする。

class FileCache
  def self.final(file, cache)
    proc{
      begin
        open(file, "w"){|f|
          f.write(Marshal.dump(cache))
        }
      rescue
        p $!
      end
    }
  end

  def initialize(file)
    begin
      @cache = {}
      @cache = Marshal.load(File.read(file)) if File.exist?(file)
    rescue
    end

    @final = self.class.final(file, @cache)
    ObjectSpace.define_finalizer(self, @final)
  end

  def save
    @final.call
  end

  def []=(a, b)
    @cache[a] = b
  end

  def [](a)
    @cache[a]
  end
end

if __FILE__ == $0
  require 'rubygems'
  require 'memcache'
  require 'benchmark'

  def f(cache)
    2000.times{
      cache["foo"] = "a"*20000
      b = cache["foo"]
    }
    #cache.save
  end

  puts Benchmark::CAPTION
  puts "mem"
  puts Benchmark.measure{ f(MemCache::new('localhost:11211')) }
  puts "file"
  puts Benchmark.measure{ f(FileCache.new("a.msl")) }
end

memcachedと速度を比べてみる。

      user     system      total        real
mem
  0.490000   1.080000   1.570000 (  1.930397)
file
  1.020000   0.020000   1.040000 (  1.038566)

こんな感じ。ruby以外だとどうなんだろう。