Repository is archived
No commit activity in last 3 years
No release in over 3 years
rack-session-stack
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Runtime

>= 2.0.0
 Project Readme

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