Хранилище объектов для объектов в Django между запросами - PullRequest
6 голосов
/ 29 августа 2009

У меня была следующая идея: скажем, у нас есть веб-приложение, написанное с использованием django, которое моделирует какую-то доску объявлений. На этой доске много тем, но некоторые из них получают больше сообщений / просмотров в час. Страницы потоков выглядят немного по-разному для каждого пользователя, поэтому вы не можете кэшировать визуализированную страницу целиком, и кэширование только некоторых частей визуализированной страницы также не вариант.

Моя идея заключалась в следующем: я создаю объектную структуру потока в памяти (с каждым постом и другими данными, необходимыми для его отображения). Если публикуется новое сообщение, структура обновляется, и каждые X сообщений (или каждые Y минут, что бы ни наступило раньше) новые сообщения записываются обратно в базу данных. Если приложение вылетает, некоторые сообщения теряются, но это определенно нормально (для пользователей и администраторов).

Вопрос: Могу ли я создать такой постоянный в памяти без сериализации (поэтому без serialize-> memcached)? Насколько я понимаю, приложения WSGI (например, Django) работают непрерывно, без остановки между запросами, поэтому это должно быть теоретически возможно. Есть ли API, который я мог бы использовать? Если нет: есть ли смысл искать?

/ edit1: я знаю, что «постоянный» обычно имеет другое значение, но в данном случае я строго имею в виду «между запросами».

Ответы [ 2 ]

6 голосов
/ 30 августа 2009

В рабочей среде WSGI у вас, вероятно, будет несколько рабочих процессов, одновременно обслуживающих запросы. Эти рабочие процессы время от времени перезапускаются, а это значит, что объекты локальной памяти будут потеряны.

Но если вам это действительно нужно (и обязательно убедитесь), я предлагаю вам изучить инфраструктуру кэширования Django , проверить кэширование в локальной памяти. Также посмотрите на сессий .

Но даже кэширование в локальной памяти использует сериализацию (с pickle). Легко реализовать кэш локальной памяти без сериализации, реализовав пользовательский бэкэнд кеша (см. документы ). Вы можете использовать код в locmem.py в качестве отправной точки для создания кэша без сериализации.

Но я подозреваю, что вы делаете небольшую преждевременную оптимизацию здесь?

0 голосов
/ 29 августа 2009

Хранение в памяти не является постоянным, поэтому нет.

Я думаю, вы имеете в виду, что вы хотите записывать в базу данных только X новых сообщений объектов. Я думаю, это из-за ускорения. Но так как вам все равно нужно рано или поздно сериализовать их, вы не экономите время таким образом. Однако вы сэкономите время, не сбрасывая новые объекты на диск, но большинство баз данных уже поддерживают это.

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

Обновление: в этом случае нет, то. Но вы все равно должны легко иметь возможность кэшировать результаты запроса, но делать этот кеш недействительным при добавлении новых ответов. Это должно помочь.

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