rack-session-stack¶ ↑
セッションの保存先を積み重ねられたらどうかと思ってやってみた。
Memcache から Sequel さらに RAWS::SDB へフォールバック¶ ↑
これは 3 段重ねの極端な例です。あらかじめご了承下さい。
セッション情報を書き込む場合は Memcache と Sequel, RAWS::SDB (Ruby Amazon Web Service - SimpleDB) の全てに書き込みます。
セッション情報を読み込む場合は、最初に Memcache から読み込みます。データが取得出来れば Memcache のデータを使い、データが取得出来なかった場合は Sequel からデータを読み込んで使います。Sequel からデータを取得出来なかった場合は RAWS::SDB へと同様にフォールバックします。
書き込みは遅いのですが、読み込みはそこそこ。
require 'rubygems' require 'sinatra' require 'rack-session-stack' require 'sequel' DB = Sequel.sqlite DB.create_table(:session) do primary_key :id String :sid, :unique => true, :null => false Datetime :created Datetime :updated column :session, File end require 'raws' RAWS.aws_access_key_id = _AWS_ACCESS_KEY_ID_ RAWS.aws_secret_access_key = _AWS_SECRET_ACCESS_KEY_ RAWS::SDB.create_domain 'session' use Rack::Session::Stack, :stack => Rack::Session::Stack::Memcache.new( {:server => 'localhost:11211'}, Rack::Session::Stack::Sequel.new( {:dataset => DB[:session]}, Rack::Session::Stack::RAWS::SDB.new( {:domain => 'session'} ) ) ) get '/' do if session['cnt'] session['cnt'] += 1 else session['cnt'] = 1 end "cnt = #{session['cnt']}" end
Memcache¶ ↑
Memcache を単体で使う場合。
require 'rubygems' require 'sinatra' require 'rack-session-stack' use Rack::Session::Stack, :stack => Rack::Session::Stack::Memcache.new( :server => 'localhost:11211' ) get '/' do if session['cnt'] session['cnt'] += 1 else session['cnt'] = 1 end "cnt = #{session['cnt']}" end
Sequel¶ ↑
Sequel を単体で使う場合。
require 'rubygems' require 'sinatra' require 'rack-session-stack' require 'sequel' DB = Sequel.sqlite DB.create_table(:session) do primary_key :id String :sid, :unique => true, :null => false Datetime :created Datetime :updated column :session, File end use Rack::Session::Stack, :stack => Rack::Session::Stack::Sequel.new( {:dataset => DB[:session]}, ) get '/' do if session['cnt'] session['cnt'] += 1 else session['cnt'] = 1 end "cnt = #{session['cnt']}" end
RAWS::SDB¶ ↑
RAWS::SDB を単体で使う場合。
require 'rubygems' require 'sinatra' require 'rack-session-stack' require 'raws' RAWS.aws_access_key_id = _AWS_ACCESS_KEY_ID_ RAWS.aws_secret_access_key = _AWS_SECRET_ACCESS_KEY_ RAWS::SDB.create_domain 'session' use Rack::Session::Stack, :stack => Rack::Session::Stack::RAWS::SDB.new( :domain => 'session' ) get '/' do if session['cnt'] session['cnt'] += 1 else session['cnt'] = 1 end "cnt = #{session['cnt']}" end