2010-02-18 6 views
0

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.

Répondre

4

Qu'est-ce que CACHE_BACKEND utilisez-vous? Si c'est locmem: // et que vous exécutez Apache, vous aurez un cache différent pour chaque enfant Apache, ce qui expliquerait les résultats différents. Je l'ai eu il y a un moment et c'était un subtil à travailler. Je vous recommande de passer à memcache si vous n'y êtes pas déjà, car cela ne vous donnera pas le problème des caches multiples

+0

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? –

+0

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

+0

Oui, merci, cela a résolu le problème! Il suffisait de changer lockmem =) –

Questions connexes