Je supprime un seul chemin du cache Django comme ceci:
/graph/123 /graph/123/2009-08-01/2009-10-21
3 Réponses :
Checkout shuttils.rmtree () ou OS.REMOWERS () . Je pense que le premier est probablement ce que vous voulez. P>
Toutes nos pages ont une clé de cache globale basée sur le statut de membre / non membre, mais ce n'est qu'environ 95% de la page. Les 5% d'autres peuvent changer sur une base par membre et donc ne sont pas du tout mis en cache. P>
Comment vous iTerez-vous via votre cache pour trouver des éléments non valides est fonction de la façon dont il est réellement stocké. Si ce sont des fichiers, vous pouvez utiliser simplement des globs globaux et / ou des répertoires récursifs, si c'est un autre mécanisme, vous devrez utiliser quelque chose d'autre. P>
Quelle réponse, et certains des commentaires des autres, essaient de dire que la manière dont vous accomplissez une invalidation de cache est intimement liée à la manière dont vous utilisez / stocker le cache. P>
Le problème de KNIPKNAP est qu'il dispose d'un groupe d'éléments de cache qui apparaissent em> pour être liés et dans une hiérarchie en raison de leurs noms, mais la logique de la génération de clé du mécanisme de cache effacera ce nom en créant Un hachage de MD5 du chemin + Vary_on. Comme il n'existe aucune trace du chemin / paramètres d'origine, vous devrez deviner de manière exhaustive toutes les combinaisons de cheminements / paramiques possibles, en espérant que vous puissiez trouver le bon groupe. J'ai d'autres hobbies plus intéressants. P>
Si vous souhaitez être capable de trouver des groupes d'articles mis en cache basés sur une combinaison de la combinaison de path et / ou de valeurs de paramètre, vous devez em> Utiliser les touches de cache pouvant être adaptées directement ou < / EM> Certains système conservent ces informations à utiliser à la durée de recherche. P>
Parce que nous n'avions pas besoin de non-lié au problème de l'OP, nous avons pris le contrôle de la mise en cache des fragments de modèle - et spécifiquement une génération clé - il y a plus de 2 ans. Cela nous permet d'utiliser RegExps de différentes manières d'invalider efficacement les groupes d'éléments cachés associés. Nous avons également ajouté un délai d'attente par défaut et des noms de variable Vary_on (résolus à l'heure d'exécution) configurable dans La seule raison de ma réponse initiale, qui était effectivement tort pour le courant de Django, était parce que j'ai utilisé des clés de cache Saner depuis si longtemps que j'ai littéralement oublié le mécanisme simple que nous sommes allés. P> Params.py code>, a modifié la commande du nom et du délai d'attente, car il n'a aucun sens pour toujours avoir à remplacer le délai d'attente par défaut dans Pour nommer le fragment, a rendu le fragment_name résolutable (c'est-à-dire. Il peut s'agir d'une variable) pour mieux fonctionner avec un système de héritage de gabarits à plusieurs niveaux et quelques autres choses. P>
Pas tout à fait i> Qu'est-ce que je voulais dire. Merci quand même.
Eh bien, alors vous devez être plus précis. Où est votre cache? Des dossiers? memcached? Base de données? S'ils sont dans des fichiers, ma réponse est dans la bonne direction. S'ils sont ailleurs ailleurs, vous avez besoin d'un mécanisme pour correspondre à tous les éléments mis en cache contenant votre objet modifié. Nous avons résolu ce problème (et plusieurs autres problèmes d'invalidation de cache) en mettant en œuvre notre propre mécanisme de mise en cache. Ce n'est pas si difficile à faire.
Désolé de savoir que la question initiale était parfaitement claire à quiconque utilise django!
Vous voudrez peut-être envisager d'employer une stratégie de mise en cache générationnelle, il semble que cela puisse correspondre à ce que vous essayez d'accomplir. Dans le code que vous avez fourni, vous stockez un numéro de "génération" pour chaque URL absolue. Ainsi, par exemple, vous initialiseriez le "/ graphique / 123" pour générer une génération, puis sa clé de cache deviendrait quelque chose comme "/ génération / 1 / graphique / 123". Lorsque vous souhaitez expirer le cache de cette URL absolu, vous augmentez sa valeur de génération (à deux dans ce cas). De cette façon, la prochaine fois que quelqu'un va chercher "/ graphique / 123" la clé de cache devient "/ génération / 2 / graphique / 123". Cela résout également la question de l'expiration de toutes les sous-pages puisqu'elles doivent faire référence à la même clé de cache que "/ Graph / 123". P>
C'est un peu délicat à comprendre au début, mais il s'agit d'une stratégie de mise en cache très élégante qui signifie que si cela signifie correctement, vous ne devez jamais rien supprimer du cache. Pour plus d'informations ici, voici Une présentation sur la cache générationnelle , celle des rails mais le concept est identique, quelle que soit la langue. P>
Donc, vous dites qu'une clé de cache de / graphique / 123 code> existe toujours et contient le contenu
/ gen / 1 / graphique / 123 code> ou
/ gen / 2 / graphique / 123 code>, etc ... donc l'application première requête
/ graphique / 123 code> pour obtenir la clé de la clé de génération la plus récente, puis interroge le cache à nouveau avec
/ gen / x / graphique / 123 code> Pour obtenir le contenu mis en cache le plus récent? C'est la partie qui est délicate, car, si ce n'est pas le cas, comment l'application interrogea-t-elle le cache si la clé de cache change toujours avec une nouvelle génération.
Une autre option consiste à utiliser un cache prenant en charge les touches de marquage et optimiser les clés par balise. L'API de cache intégrée de Django n'a pas de soutien à cette approche. Mais au moins un backend de cache (ne pas partie de Django approprié) a un support.
L'installation est facile avec PIP CODE>: P>
cache._cache.evict('/graph/123')
Je ne suis pas sûr que si j'ai bien compris votre question correcte, vous voulez dire que vous voulez affleurer tout le cache s'attendre à un avec id "123"?
Je veux rincer le cache pour n'importe quel chemin qui commence par '/ graphique / 123 /'.
Je ne comprends pas pourquoi êtes-vous inquiet pour un chemin?
Parce que Django utilise le chemin de demande pour créer une clé pour le cache. Que pensez-vous que cela n'est pas clair?