【问题标题】:Sinatra database-based sessions基于 Sinatra 数据库的会话
【发布时间】:2016-08-20 16:59:25
【问题描述】:

我目前正在使用带有 Heroku 的 Sinatra,唯一的同步是数据库。因此,我需要存储在数据库中的会话(希望不使用 ActiveRecord)。

是否有 Rack 中间件或其他东西可以做到这一点?

【问题讨论】:

    标签: session heroku sinatra


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 谢谢!正是我想要的!
    • 您需要定义所有 3 个吗?我想设置redis。我使用了站点中的一个示例:gist.github.com/61dabb63d4333bb83eba,但每个会话存储都有近 100 个条目。
    • 不,一个就够了,我的例子只是展示了不同的使用方式。如果您在 Shotgun 上运行,每个链接的资产可能生成一个新会话,这可能是原因。如果您遇到其他问题,请检查您的日志并发布新问题。
    【解决方案2】:

    您可以在 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 作为会话存储。

    【讨论】:

    • 非常感谢!我也会考虑这个解决方案。
    • P.S.您也可以将 Memcached 与 Moneta 一起使用,并且您仍然可以利用 Moneta 的出色 DSL。
    • 我不知道Moneta,看起来很有用。你知道使用它而不是Dalli 有什么缺点吗?我想,它也可以用于Iron cache
    猜你喜欢
    • 2016-12-26
    • 2011-09-18
    • 2015-01-31
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2013-08-16
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多