我目前正在将 Sinatra 与 Heroku 一起使用,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用 ActiveRecord)。
是否有 Rack 中间件或其他东西可以做到这一点?
您可以将Moneta
gem用作 Sinatra 的替代会话管理器。
直接来自他们的 GitHub 页面:
Moneta 提供了一个标准接口,用于与各种键/值存储进行交互......
将 Moneta 设置为 Rack 会话存储:
# in your config.ru
require 'rack/session/moneta'
# Use only the adapter name
use Rack::Session::Moneta, :store => :Redis
# Use Moneta.new
use Rack::Session::Moneta, :store => Moneta.new(:Memory, :expires => true)
# Use the Moneta builder
use Rack::Session::Moneta do
use :Expires
adapter :Memory
end
它几乎适用于您能想到的任何东西:基于文件和内存存储、ActiveRecord、Sequel、DataMapper、Memcached、REDIS、CouchDB、MongoDB 等。
为了详细说明与您的Rack
应用程序的集成,这是在 Heroku 上运行并使用Redis Cloud插件config.ru
的生产站点上设置my 的方式:
if ENV['RACK_ENV'].to_sym == :production
use Rack::Session::Moneta,
key: 'domain.name',
domain: '.example.com',
path: '/',
expire_after: 7*24*60*60, # one week
secret: ENV['PRODUCTION_SESSION_SECRET_KEY'],
store: Moneta.new(:Redis, {
url: ENV['REDISCLOUD_URL'],
expires: true,
threadsafe: true
})
else
use Rack::Session::Moneta,
key: 'domain.name',
domain: '*',
path: '/',
expire_after: 30*24*60*60, # one month
secret: ENV['DEV_SESSION_SECRET_KEY'],
store: Moneta.new(:Redis, {
url: ENV['DEV_REDIS_URL'],
expires: true,
threadsafe: true
})
end
您可以在 Heroku上使用 memcache 插件,而不是使用数据库进行会话存储。您可以在memcachier 文档中了解它
将 memcache 配置为会话存储的 Sinatra 片段
require 'rack/session/dalli'
mem_serv, mem_uname, mem_pword = ENV['MEMCACHIER_SERVERS'], ENV['MEMCACHIER_USERNAME'], ENV['MEMCACHIER_PASSWORD']
cache = Dalli::Client.new(mem_serv, {:username => mem_uname, :password => mem_pword})
use Rack::Session::Dalli, :cache => $cache
IMO memcache 作为会话存储比使用数据库更有意义。我能想到的其他选择是 Redis 作为会话存储。