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