【发布时间】:2016-08-20 16:59:25
【问题描述】:
我目前正在使用带有 Heroku 的 Sinatra,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用 ActiveRecord)。
是否有 Rack 中间件或其他东西可以做到这一点?
【问题讨论】:
我目前正在使用带有 Heroku 的 Sinatra,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用 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 应用程序的集成,这就是我的 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
【讨论】:
您可以在 Heroku 上使用memcache add-on,而不是使用数据库进行会话存储。你可以在memcachier documentation阅读它
Sinatra sn-p 将 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 内存缓存作为会话存储比使用数据库更有意义。我能想到的其他替代方案是 Redis 作为会话存储。
【讨论】:
Moneta 一起使用,并且您仍然可以利用 Moneta 的出色 DSL。
Moneta,看起来很有用。你知道使用它而不是Dalli 有什么缺点吗?我想,它也可以用于Iron cache。