Как определить, поместится ли объект в кеш cookie или нет в рельсы - PullRequest
0 голосов
/ 02 июля 2018

У нас есть приложение, которое использует 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

1 Ответ

0 голосов
/ 02 июля 2018

Вы можете проверить, насколько большой объект находится в памяти, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...