Действительно ли нужна django-cache-machine?
MyModel1.objects.all()[0]
Примерно переводится как
SELECT * FROM app_mymodel LIMIT 1
Такие запросы всегда выполняются быстро. Не будет существенной разницы в скорости, извлекаете ли вы его из кеша или из базы данных.
Когда вы используете диспетчер кеша, вы на самом деле добавляете здесь немного накладных расходов, которые могут немного замедлить работу. В большинстве случаев эти усилия будут потрачены впустую, потому что попадание в кэш может и не произойти, как описано в следующем разделе.
Как работает django-cache-machine
Всякий раз, когда вы запускаете запрос, CachingQuerySet
будет пытаться найти этот запрос в кеше. Запросы обозначаются {prefix}:{sql}
. Если он есть, мы возвращаем кешированный набор результатов, и все довольны. Если запрос не находится в кеше, выполняется обычный код для запуска запроса к базе данных. По мере повторения объектов в результирующем наборе они добавляются в список, который будет кэшироваться после завершения итерации.
источник: https://cache-machine.readthedocs.io/en/latest/
Соответственно, если два запроса, выполненные в вашем вопросе, идентичны, диспетчер кеша извлечет второй набор результатов из memcache, если кеш не стал недействительным.
В той же ссылке объясняется, как аннулируются ключи кеша.
Чтобы упростить аннулирование кеша, мы используем «flush lists», чтобы пометить кешированные запросы, которым принадлежит объект. Таким образом, все запросы, в которых был найден объект, будут признаны недействительными при изменении этого объекта. Скрытые списки сопоставляют ключ объекта со списком ключей запроса.
Когда объект сохраняется или удаляется, все ключи запроса в его списке сброса будут удалены. Кроме того, будут очищены списки сброса его отношений внешнего ключа. Чтобы избежать устаревших отношений внешнего ключа, любые кэшированные объекты будут сброшены, когда объект, на который указывает их внешний ключ, становится недействительным.
Понятно, что сохранение или удаление объекта приведет к тому, что многие объекты в кеше будут признаны недействительными. Таким образом, вы замедляете эти операции с помощью диспетчера кеша. Также стоит отметить, что в документации по аннулированию вообще не упоминаются многие ко многим полям. Для этого существует открытая проблема, и из вашего комментария к этой проблеме ясно что вы тоже это обнаружили.
Решение
Кэш-машина Чака. Кэширование всех запросов почти никогда не стоит того. Это приводит ко всем трудным для поиска ошибкам и проблемам. Лучший подход — оптимизировать ваши таблицы и точно настроить запросы. Если вы обнаружите, что конкретный запрос слишком медленный, кэшируйте его вручную.
person
e4c5
schedule
19.06.2016
m2.save()
послеm2.model1.add(m1)
. Раньше у меня была эта проблема. Но с тех пор, как я это сделал, у меня его нет. - person Rahul   schedule 18.06.2016