J'ai créé le modèle pour compter le nombre de vues de ma page:Quel est le problème dans cette fonction de mise en cache dans Django?
class RequestCounter(models.Model):
count = models.IntegerField(default=0)
def __unicode__(self):
return str(self.count)
Pour incrémenter le compteur que j'utilise:
def inc_counter():
counter = RequestCounter.objects.get_or_create(id =1)[0]
counter.count = F('count') + 1
counter.save()
Ensuite, je montre le nombre de pages vues sur mon page et ça marche bien. Mais maintenant je dois mettre en cache mon compteur pendant un certain temps. J'utilise:
def get_view_count():
view_count = cache.get('v_count')
if view_count==None:
cache.set('v_count',RequestCounter.objects.filter(id = 1)[0],15)
view_count = cache.get('v_count')
return view_count
Après cela, je passe le résultat de get_view_count à mon modèle.
Donc, je m'attendais à ce que mon compteur reste immobile pendant 15 secondes, puis change pour une nouvelle valeur. Mais, en fait, ce n'est pas tout à fait le cas: quand je le teste depuis mon ubuntu virtuel, il saute, par exemple, de 55 à 56, après 15 secondes il change et passe maintenant de 87 à 88. Les valeurs sont toujours alternant et ils ne diffèrent pas beaucoup les uns des autres. Si j'essaye ceci localement à partir de Windows, le compteur semble être bon, jusqu'à ce que j'essaye d'ouvrir plus que le navigateur. Je n'ai aucune idée de ce qu'il faut faire avec. Voyez-vous quel peut être le problème?
p.s. J'ai essayé d'utiliser la mise en cache dans les modèles - et j'ai reçu le même résultat.
Si vous êtes, j'utilise locmem: // et je suis sur Apache. Cela signifie-t-il que, si je passe à memcache ou change CACHE_BACKEND, mon code fonctionnera correctement? –
Vous devrez changer votre CACHE_BACKEND en memcache (voir les documents du cache de Django) afin de pouvoir utiliser memcached. (Ainsi que la configuration de memecached, mais c'est assez simple avec apt-get). Comme memcached est partagé par tous les threads/enfants Apache, il n'y aura qu'un seul ensemble de données en cache pour votre application, votre problème s'arrêtera probablement - en supposant que je pense à juste titre que le cache multiple-locmem est ce qu'il y a racine de celui-ci: o) –
Oui, merci, cela a résolu le problème! Il suffisait de changer lockmem =) –