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以外だとどうなんだろう。