Rails 如何知道何时从 `sessions` 表中删除记录?

Posted

技术标签:

【中文标题】Rails 如何知道何时从 `sessions` 表中删除记录?【英文标题】:How does Rails know when to delete a record from the `sessions` table? 【发布时间】:2011-07-27 03:31:36 【问题描述】:

Rails 如何知道何时从会话表中删除记录?

例如,如果用户访问网站,创建了一个会话记录,但是当用户关闭浏览器窗口时,服务器没有收到任何通知,那么 Rails 是如何从会话表中删除记录的呢?

【问题讨论】:

【参考方案1】:

有更简单的方法:

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

您可以在 Controller 中的一些操作之后调用它,这段代码会杀死所有死会话。

当然这是有争议的技术,但最简单。

Full story

【讨论】:

我真的很想异步执行类似的操作,例如从 cronjob 执行。 这很好用,通过 rails runner 和任何时候 gem 将其作为 cron 作业运行。 我们遇到了类似的问题,不想通过 cron 运行它,所以我们正在试验 mysql 事件:dev.mysql.com/doc/refman/5.5/en/create-event.html。希望这可以帮助其他人遇到同样的事情。 这里是更新的“全文”链接,认为使用数据存储是一种有争议的技术。 isnorcreative.com/blog/… 在使用多个 Web 服务器时,我们将数据库存储用于会话。这是一个很好的解决方案,只要您清除过时的会话,否则,它会非常膨胀。【参考方案2】:

据我了解,您必须提供自己的会话到期实现。

This API page 给你一个相当不错的答案来了解它是如何工作的。您创建具有额外属性 created_on 和 updated_at 的数据库表(并且您可以免费获得时间戳),然后您只需通过查看 updated_at 属性创建一个作业以使它们随时到期。

This post 有如何运行作业的详细信息。

【讨论】:

以上是关于Rails 如何知道何时从 `sessions` 表中删除记录?的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 5 开始,何时需要手动设置 :inverse_of?

从 Rails 中检测 ngrok

Ruby on Rails 中的会话如何工作?

何时在 Elastic Beanstalk 中使用多容器 docker 来运行 Rails 应用程序?

何时使用 Spring Prototype vs Request vs Session 范围?任何现实生活中的例子

Rails:如何使用容器从 ECS 重用 AWS 凭证