19

我将活动记录存储用于 Rails 会话存储。

在很短的时间内,sessions桌子的大小增加了很多。这些会话行在一段时间后如何转储。还是我应该在 24 小时内手动清除一次?

4

4 回答 4

35

在 Rails 3.2 中使用对 ActiveRecord 的标准调用。对于日期,传递一个与“记住我”持续时间长度相匹配的值。在我的示例中,这将清除两周内不活动的所有会话。

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])

正如下面@journeyer 所述,如果使用 Devise gem,可以参考 Devise 的配置。

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])

如果使用魔法宝石,可以参考魔法的配置。

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
于 2013-07-20T12:57:50.337 回答
23

关于您的问题的一篇好博文:http: //blog.brightbox.co.uk/posts/clearing-out-rails-sessions

解决方案是创建一个自定义 rake 任务:

task :clear_expired_sessions => :environment do
    sql = 'DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 DAY);'
    ActiveRecord::Base.connection.execute(sql)
end

...并每天使用 cron 作业运行它。

于 2012-04-10T12:22:10.650 回答
7

当您调用reset_sessionrails 时,将从会话表中删除该行。然而,并不是每个会话都会reset_session调用它:如果用户在没有注销的情况下关闭浏览器,那么浏览器将丢弃会话 cookie,因此该会话行将永远不会被再次使用,但reset_session不会被调用。

Rails 不会为你清除那些积累的垃圾——你可以在你认为合适的时候对它进行任何整理。在之前的作业中,我们使用运行删除旧会话行的 cronjob。

于 2012-04-10T12:20:44.057 回答
-1

我建议使用 cron 作业或其他方式清除您的 Rails 会话。也许不是 24 小时,这取决于您希望用户会话可用多长时间。Rails 为此提供了一个 rake 任务

耙分贝:会话:清除

于 2012-04-10T12:20:31.123 回答