2012-06-25 2 views
-1

Я делаю несколько большое приложение рельсов, где пользователи заполняют несколько форм и взамен цитируются для страхования автомобилей. Двигатели цитирования являются внешними, а также внешней БД.Большие сессии в Rails - не хранится в локальной базе данных

Мне не нужно хранить сеанс в mysql или аналогичном DB долговременном.

Что было бы лучшим способом сохранить эти сеансы.

CookieStore небезопасен, а также слишком ограничен (< 4kb cookie).

Memchached - это возможность, за исключением того, что мне не нравится идея пары ключей => значение, я хотел бы, если возможно, больше ассоциативных массивов.

Любой DB родственный магазин сессия является излишним для этих нужд (?)

какой-то файл хранилища системы может быть путь?

Возможно, кто-нибудь посоветует наилучший способ хранения сеансов?

+0

Что вы храните в сеансах? Кажется, если они> 4kb, вы можете слишком много хранить. –

+0

@Beerlington, я сохраняю ответ от механизма калькуляции страхования, а также данные формы. – Harry

ответ

1

Memcache или магазин базы данных - это путь. В обоих случаях, когда ваш сайт масштабируется, ваши многочисленные серверы смогут получать/устанавливать данные сеанса.

Я использовал и в прошлом, и есть несколько вещей, которые вы должны знать:

1) Оба могут хранить произвольные данные

A Rails сессии рассматривается как Hash, а значение который хранится, является сериализованной версией этого хэша. В Memcache ключ => пара значений - session_id => session_contents. В хранилище базы данных у вас есть два столбца: один для идентификатора и один для содержимого.

2) Memcache немного быстрее

Каждый немного скорости помогает; для этой цели Memcache будет быстрее, чем база данных.

3) Memcache имеет тенденцию к снижению клавиш, когда он получает полный

Если Memcache экземпляр запускается из памяти, он начинает падать ключи. Он делает это, сначала отбрасывая самые старые. Поскольку сеансы активно используются, вы можете уменьшить это, пощекотав данные сеанса по каждому запросу; который держит их в верхней части кучи. Но если ваш экземпляр действительно заполнен, возможно, вы начнете сбрасывать сеансы на пол и регистрировать пользователей. Обычно это проблема только в ситуации очень быстрого роста, например, если вы получаете slashdotted. В противном случае достаточно просто следить за сервером Memcache и следить за тем, чтобы у вас не было памяти.

4) Таблица базы данных будет быстро заполняться истекшими сеансами Memcache автоматически отбрасывает старые вещи. Когда пользователь не выходит из системы, а просто отказывается от сеанса, вы должны вручную выполнить очистку в базе данных. Обычно это лучше всего делать с ежедневным заданием cron. Если нет, вы получите базинированные устаревшие записи, которые замедляют запрос к этой таблице.

Что лучше для вас? Я не знаю. Это зависит от вашей ситуации и тех рисков, которые вы готовы принять. У меня никогда не было проблемы с удаленными сеансами с memcache, но это действительно зависит от того, для чего еще вы используете memcache. Если вы используете его много, второй экземпляр memcache только для сеансов может быть способом. Тогда нет риска сбросить их.

+0

Отмечено так же правильно, как и на самом деле отвечает на мой вопрос. – Harry

1

Я не понимаю, почему это невозможно обработать с помощью базы данных.

Я бы посоветовал использовать базу данных для хранения данных во время их обработки и удалить Cron job старые записи в нерабочее время.

Если есть денежные операции участие, или другой вид транзакций базы данных, которые требуют данных, которые будут обрабатываться в ACID образом, вы должны использовать базу данных, как PostgreSQL или подобные.

Если это не так, и вы просто хотите сохранить некоторые данные быстро, то почему бы не использовать NoSQL решения, как MongoDB?

Кроме того, в качестве предупреждения, если вы решите использовать файловую систему для хранения ваших данных, вы можете столкнуться с проблемами масштабирования, когда данные хранятся на одном сервере, но запрос обрабатывается другим.

+0

Абсолютно. Использование файловой системы - это форма [ложной лени] (http://c2.com/cgi/wiki?FalseLaziness), которой следует избегать. Используйте базу данных с самого начала. Даже SQLite лучше, чем ничего, поскольку перенос на реальную СУБД в этом случае тривиален. – tadman

+0

Это может быть обработано в базе данных, но может быть совершенно ненужным, поскольку каждая строка никогда не будет длиться более 30 минут. Поэтому я просил совета. – Harry

Смежные вопросы