【问题标题】:How to clear old/stale sessions when using Mongo DB session storage in Ruby on Rails 3.2在 Ruby on Rails 3.2 中使用 Mongo DB 会话存储时如何清除旧的/陈旧的会话
【发布时间】:2015-02-19 08:35:59
【问题描述】:

我继承的 Ruby on Rails 应用程序运行良好,但使用 MongoDB 进行会话存储。并且会话集合表已经超过 2 年(!!!)没有被清除,这意味着它有超过 200 万个条目,占用了大约 4GB(!!!)的空间。对于一个比 4GB 小很多的数据库来说,这不好、不需要,而且对空间的滥用令人难以置信。

因此,在研究如何清理这些东西时,我在各种网站(Stack Overflow 和其他网站)上看到了许多帖子,这些帖子解释了一般过程:

这很有意义:创建一个连接到sessionsrake 任务,并根据updated_at 标准删除条目。一切顺利!

我的问题是这个 Ruby on Rails 应用程序使用 MongoDBMongoid 所以这些页面上提供的示例实际上都没有帮助。所以这样的事情是行不通的:

namespace :sessions do
  desc "Clear expired sessions (more than 7 days old)"
  task :cleanup => :environment do
    ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 7.days.ago])
  end
end

该应用程序不使用 ActiveRecord,所以没有骰子。 rake 任务在 ActiveRecord 不存在的情况下终止,如果包含 ActiveRecord 则终止,因为核心数据库逻辑不依赖于 ActiveRecord 模型;都是 Mongoid。

另外使用一些人推荐的所谓的内置rake db:sessions:clear 似乎不起作用,我认为它连接到不使用 ActiveRecord 的应用程序,因此该任务甚至不存在。

如何在 Rails 3 中使用 Mongoid 创建等效查询,以从 DB 会话存储中清除明显死、旧和陈旧的会话?

【问题讨论】:

    标签: ruby-on-rails ruby mongodb session


    【解决方案1】:

    解决这个问题的关键是理解,当 Rails 3 应用程序的 session_store 设置为 mongoid_store 时,使用直接的 Mongoid 方法永远不会允许发生这种直接的数据库交互。

    因此,通过将 Mongoid 仅用于基本数据库连接,然后在驱动程序操作级别上直接与 Mongoid 的Moped 核心进行交互,可以轻松实现相同的功能!这是我想出的 Mongoid/Moped rake 任务,效果很好:

    namespace :sessions do
      stale_window = 7
      desc "Clear stale DB sessions older than #{ stale_window } days."
      task :cleanup => :environment do
        db = Mongoid::Sessions.default
        begin
          db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
        rescue Moped::Errors::SocketError => e
          # Rescue here if needed. If not, the screwed up process dies silently.
        end
      end
    end
    

    连接是通过db = Mongoid::Sessions.default 设置的,神奇的发生在一行中:

    db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
    

    我已经设置了一个stale_window 变量,所以我可以轻松地调整这个任务的范围;设置 DB 值以及描述。要使用它,我从代码库路径中运行它:

    RAILS_ENV=production bundle exec rake sessions:cleanup
    

    当然,只需更改 RAILS_ENV 值以匹配您希望此任务执行的环境;例如stagingdevelopment 或您可能为您的环境命名的任何其他名称。运行 rake 任务后,sessions 集合表被修剪为更符合实际使用情况的内容,并且整体数据库大小更易于处理。

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多