这个Django缓存函数有什么问题?

0 投票
1 回答
544 浏览
提问于 2025-04-15 19:26

我创建了一个模型,用来统计我页面的浏览次数:

class RequestCounter(models.Model):
    count = models.IntegerField(default=0)
    def __unicode__(self):
        return str(self.count)

为了增加这个计数器,我使用了:

def inc_counter():
    counter = RequestCounter.objects.get_or_create(id =1)[0]
    counter.count = F('count') + 1
    counter.save()

然后我在我的页面上显示这个浏览次数,效果很好。 但是现在我需要让这个计数器缓存一段时间。我使用:

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

之后,我把get_view_count的结果传递给我的模板。

所以我期待我的计数器能静止15秒,然后再变成一个新值。但实际上并不是这样:当我在我的虚拟Ubuntu上测试时,它的值会从55跳到56,15秒后又变成87跳到88。 这些值总是交替变化,而且彼此之间差别不大。 如果我在Windows上本地测试,计数器似乎正常,直到我尝试打开多个浏览器。 我不知道该怎么处理这个问题。你觉得可能是什么原因呢?


附言:我尝试在模板中使用缓存,结果也是一样。

1 个回答

4

你在用什么缓存后端呢?如果你用的是 locmem://,而且你的服务器是 Apache,那么每个 Apache 的子进程都会有一个不同的缓存,这就能解释为什么结果会不一样。我之前也遇到过这个问题,搞了很久才弄明白。建议你如果还没用的话,可以换成 memcache,这样就不会出现多个缓存的问题了。

撰写回答