【问题标题】:What's wrong in this caching function in Django?Django中的这个缓存功能有什么问题?
【发布时间】:2010-02-18 13:00:02
【问题描述】:

我已经创建了计算页面浏览量的模型:

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 本地尝试此操作,则计数器似乎没问题,直到我尝试打开的不仅仅是浏览器。 不知道该怎么办。您知道可能是什么问题吗?


附言我尝试在模板中使用缓存 - 并收到了相同的结果。

【问题讨论】:

    标签: python django caching


    【解决方案1】:

    您使用的是什么 CACHE_BACKEND?如果它是 locmem:// 并且您正在运行 Apache,那么每个 Apache 子节点都会有一个不同的活动缓存,这将解释不同的结果。不久前我有这个,这是一个微妙的解决方案。如果您还没有使用内存缓存,我建议您切换到它,因为这不会给您带来多缓存问题

    【讨论】:

    • 对,我正在使用 locmem://,我在 Apache 上。这是否意味着,如果我切换到 memcache 或更改 CACHE_BACKEND,我的代码会正常工作吗?
    • 您必须将 CACHE_BACKEND 更改为 memcache(请参阅 Django 缓存文档)才能使用 memcached。 (以及可能设置 memecached,但使用 apt-get 非常简单)。因为 memcached 由所有 Apache 线程/子进程共享,所以您的应用程序只会有一组缓存数据,您的问题可能会停止——假设我认为多 locmem 缓存是根本原因是正确的它:o)
    • 是的,谢谢,这解决了问题!改变 lockmem=) 就足够了
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2023-03-29
    相关资源
    最近更新 更多