Кеширование Django для веб-приложений - PullRequest
3 голосов
/ 22 февраля 2011

Мой вопрос о передовых методах кэширования обновлений баз данных в Django.

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

У меня есть представление TicketDetail, которое показывает описание билета и связанные с ним обновления. Пользователи могут добавить обновление из этого представления. Я включил кэширование всего сайта с помощью memcached.

Если пользователь добавляет обновление и затем перезагружает это представление, он некоторое время не увидит обновление. Я понял почему, потому что мне нужно включить кэширование для каждого просмотра и отключить его для этого представления.

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

Есть ли прямой способ сделать это? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Существуют некоторые проблемы при использовании memcached для аннулирования / обновления устаревших данных из-за расы условий , от которых зависит один из основных Johnny Cache бэкэндов.В вашем конкретном случае, скажем, у вас всего 10 обновлений, а затем два разных пользователя в двух отдельных процессах создают обновление заявки.Вполне возможно, что в итоге вы отобразите только 11 обновлений для обоих, хотя их всего 12: одно из них закончится серьезным случаем WTF?

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

Но, не понимая в полной мере той работы, которую вы выполняете, было бы неправильно предлагать такую ​​вещь.Однако я хотел бы предложить вам рассмотреть возможность использования mongoDB , Tokyo Cabinet или Redis в качестве замены кэша для memcached, вситуации, когда вам нужно иметь детальный контроль над обновлением критических пользовательских данных.

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

0 голосов
/ 22 февраля 2011

Не совсем то, что вам нужно, но johnny-cache будет кешировать наборы запросов, автоматически аннулируя записи.

Может быть достаточно того, что вам нужно: после настройки это не работа.

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