python - framework - install memcached django




Django elimina la memoria caché con key_prefix específico (2)

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


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()

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.







django-cache