【问题标题】:How to determine if an object would fit in the cookie cache or not in rails如何确定一个对象是否适合 cookie 缓存或不在 Rails 中
【发布时间】:2018-12-10 15:23:57
【问题描述】:

我们有一个使用CookieStore 来存储会话数据的应用程序。除其他外,我们使用此功能在会话中存储对象以提高我们网站的性能,例如

session[:data] = some_object

通常没问题,但有时some_object 的表示太大而无法存储为cookie。在这种情况下,我们完全乐于不将对象存储在会话中 - 它只会稍微提高站点的性能,并且只会影响我们的少数用户。但是,要使其正常工作,我们需要尽早决定是否存储该对象,否则我们将在中间件级别获得 ActionDispatch::Cookies::CookieOverflow - 为时已晚。

有没有一种简单的方法来获取对象的大小?我们正在考虑将对象转换为 JSON 并检查它的字符串长度,但可能会有更好的解决方案。

简而言之,我们对实现以下stored_as_cookie_size 方法感兴趣:

if stored_as_cookie_size(some_object) < LIMIT
   session[:data] = some_object
else
   session[:data] = nil
end

【问题讨论】:

  • 这个对象是私有的并且需要加密吗? (会话 cookie 总是加密的)加密会增加字符串的大小。此外,会话 cookie 已经存储了一些数据(CSRF 令牌..)也许您可以将此对象存储在单独的 cookie 中,无论是否加密,并在会话结束时将其删除
  • 我们认为对我们来说最好的选择是重构它,使其存储在服务器端缓存中,但是这个功能已经在很多地方使用,我们还没有容量做这个重构。如果我们缩小限制,我们没关系,因为对于我们的大多数用户来说,对象的大小是
  • 可能您可以只将对象 ID 存储在会话存储中,而不是整个对象。然后可以从该 id 中获取该对象。将整个对象存储在 cookie 中可能会暴露一些敏感数据。还有一件事 cookie 最大限制是 4kb,因此您不能存储大于该值的对象
  • @SujayGavhane 这用于缓存原因意味着仅存储 id 会破坏目的

标签: ruby-on-rails ruby session cookies


【解决方案1】:

您可以使用ObjectSpace 测试对象在内存中的大小。

ObjectSpace.memsize_of(obj)

或者您可以将其序列化为字符串并比较字符串的大小。

str = YAML::dump(obj)

ObjectSpace 只会提示您对象的大小,但速度会很快。序列化对象会更慢但更准确。

对所有对象使用其中一种策略,以了解对象在序列化到 cookie 时的大小。确定你的截止应该是什么,然后根据大小设置 cookie。

str = YAML::dump(obj)
session[:data] = obj if str.length < MAX_OBJ_SIZE

您必须进行测试以确定 MAX_OBJ_SIZE 的正确值,但您知道它会小于 4000。

【讨论】:

  • 但这两者会给出不同的结果,正如@Maxence 所说,加密也可能会增加一些开销,所以这些对初学者来说很有用,但我想知道是否有更准确的方法
  • 我添加了更多解释。您需要选择一种策略,然后使用它来确定是否将对象放入 cookie。
猜你喜欢
  • 2012-06-14
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多