首页 > 解决方案 > 如何确定一个对象是否适合 cookie 缓存或不在 Rails 中

问题描述

我们有一个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

标签: ruby-on-railsrubysessioncookies

解决方案


您可以使用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。


推荐阅读