python - borrar - django rest framework cache
Django elimina la memoria cachĂ© con key_prefix especĂfico (2)
Como @ e4c5 mencionó que el caché se usa para cosas rápidas, debes usar redis para lo mismo. Pero como su pregunta es sobre la base de datos, respondería lo mismo.
No hay una función existente para hacer esto en Django. Pero entonces la mejor parte de Python es que puedes fácilmente crear una nueva ruta para agregar nuevas funcionalidades. A continuación hay una solicitud de prueba que creé
def index(request):
cache.set("name", "tarun")
cache.set("name_1", "tarun")
cache.set("name2", "tarun")
cache.set("name_4", "tarun")
cache.set("nam", "tarun")
cache.clear(prefix="name")
nam = cache.get("nam")
name_4 = cache.get("name_4", default="deleted")
return HttpResponse("Hello, world. nam={nam}, name_4={name_4}".format(nam=nam, name_4=name_4))
Para obtener la funcionalidad de prefix
, debe agregar el código de parche a continuación en algún lugar. Utilicé settings.py
como tal
original_clear = None
def patch_clear():
from django.db import connections, router
from django.core.cache.backends.db import DatabaseCache
def __clear(self, prefix=None, version=None):
db = router.db_for_write(self.cache_model_class)
connection = connections[db]
table = connection.ops.quote_name(self._table)
with connection.cursor() as cursor:
if prefix is None:
cursor.execute(''DELETE FROM %s '' % table)
else:
prefix = self.make_key(prefix, version)
cursor.execute("DELETE FROM %s where cache_key like ''%s%%''" % (table, prefix))
global original_clear
original_clear = DatabaseCache.clear
DatabaseCache.clear = __clear
patch_clear()
Estoy usando el decorador @cache_page
por vista de @cache_page
y he establecido un key_prefix
diferente para cada vista.
He eliminado previamente el caché con:
from django.core.cache import cache
cache.clear()
Pero, ¿qué key_prefix
si solo quiero eliminar las claves que contienen un key_prefix
específico? Obviamente, puedo hacerlo simplemente conectándome a la base de datos y borrando con sql en bruto, pero me pregunto si se puede hacer con Django ''puro''.
Estoy usando un caché de base de datos, no un caché de memoria.
Estoy usando Django 1.11 y Python 3.6
TLDR ; cache.delete
y cache.delete_many
son sus opciones disponibles.
Respuesta larga. @cache_page
está sobrevalorado. Cuando utiliza este decorador, a menudo encuentra que el caché siempre contiene muchas más entradas de caché de las que esperaba. Terminas queriendo borrar un montón de entradas de caché. Lo cual parece ser exactamente lo que sucedió aquí.
Estoy usando un caché de base de datos, no un caché de memoria.
Una de las ideas principales de utilizar el almacenamiento en caché es reducir la carga en el servidor; otra es reducir los cálculos costosos o las consultas de DB. Pero en realidad, una gran cantidad de páginas web no tienen cálculos costosos. La mayoría de las consultas lentas se pueden optimizar eligiendo cuidadosamente sus índices.
Si la base de datos en sí es esa caché, no está reduciendo la carga en la base de datos. ¿Y qué pasa si necesita mostrar contenido diferente para diferentes usuarios? Esto es terriblemente complicado.
¿Qué sucede si solo quiero eliminar las claves que contienen un key_prefix específico?
Considera usar Redis. Este es uno de los mejores backends de caché disponibles en django (como un módulo de terceros). Ser capaz de eliminar varias teclas en un solo comando es una de las muchas funciones útiles de redis.