【问题标题】:Expiring an index of an session variable after a specific interval在特定时间间隔后过期会话变量的索引
【发布时间】:2020-12-08 23:11:04
【问题描述】:

我有一个 ruby​​ on rails 应用程序,其中我有多个会话变量,其中我有一个特定的会话变量数组,我想在添加它们后每 10 秒删除其值

例如我有一个会话变量

session[:somename] = ["0","1","2","3"]

现在我想在添加会话变量 10 秒后删除它们的索引,因此 0 应该在被推入会话后 10 秒删除。有没有办法做到这一点?我可以为一个会话明确设置到期时间吗?或者有没有办法以任何其他形式实现这一点,然后使用会话?

任何帮助表示赞赏,在此先感谢

【问题讨论】:

  • 您可以使用 cronjob,即 Sidekiq。一旦将任何值添加到数组中,执行 SidekiqWorker.perform_in(Time.now + 10.seconds) 以在 worker 中将其删除。

标签: arrays ruby session ruby-on-rails-5 session-variables


【解决方案1】:

简短的回答是否定的。

默认情况下,rails 使用单个 cookie 将会话存储为序列化哈希。 cookie 本身可以有一个到期时间,此时客户端会拒绝整个会话 cookie 并且不会将其发送回 rails。但是没有内置的解决方案可以使会话中的单个值过期。

但如果你有点创意,尽管你可以将数组转换成一组对:

t = Time.current.to_i
["0","1","2","3"].map.with_index {|v, i| [v, t + ((i + 1) * 10) ]}
# => [["0", 1597863985], ["1", 1597863995], ["2", 1597864005], ["3", 1597864015]]

第二个值只是该值到期时的 unix 时间戳。然后,您将在读回过期值时拒绝它:

Time.now.then { |t| serialized.reject{ |(v, e)| Time.at(e) < t } }

【讨论】:

  • 这个技巧很有魅力,非常感谢@max
猜你喜欢
  • 2019-08-15
  • 2023-03-21
  • 2016-11-11
  • 2015-08-25
  • 2011-11-30
  • 1970-01-01
  • 2015-10-17
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多