我目前正在将Sinatra与Heroku一起使用,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用ActiveRecord)。
是否有Rack中间件或其他类似的东西?
答案 0 :(得分:9)
您可以使用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
应用的集成,我的config.ru
是在Heroku上运行的生产网站上设置并使用Redis Cloud附加组件的方式:
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
答案 1 :(得分:1)
您可以在Heroku上使用memcache add-on,而不是使用数据库进行会话存储。您可以在memcachier documentation
中阅读相关内容Sinatra片段将memcache配置为会话存储
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作为会话存储。