Что не так в этой функции кэширования в Django? - PullRequest
0 голосов
/ 18 февраля 2010

Я создал модель для подсчета количества просмотров моей страницы:

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. Значения всегда чередуютсяи они не сильно отличаются друг от друга.Если я пытаюсь сделать это локально из окон, счетчик, похоже, будет в порядке, пока я не попытаюсь открыть больше, чем браузер.Понятия не имею, что с этим делать.Вы видите, в чем может быть проблема?


ps Я пытался использовать кэширование в шаблонах - и получил тот же результат.

1 Ответ

4 голосов
/ 18 февраля 2010

Какой CACHE_BACKEND вы используете? Если это locmem: // и вы используете Apache, у вас будет свой активный кэш для каждого дочернего элемента Apache, что объясняет разные результаты. Я имел это некоторое время назад, и это было тонкое, чтобы выработать. Я бы порекомендовал переключиться на memcache, если вы еще не используете его, поскольку это не вызовет проблемы с несколькими кэшами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...