2017-01-31 11 views
1

У меня есть разбитый на страницы форум Django, где сообщения пользователей накапливаются в соответствии с последним временем публикации. Я показываю 20 сообщений на странице. В пиковое время новый пост сохраняется каждые ~ 2 секунды, тогда как страницы запрашиваются для просмотра до 11 раз в секунду.Использование кэширования для первой страницы разбитого на страницы вида в Django

Я хочу уменьшить удары БД путем введения кэширования. Я заметил, что большая часть трафика попадает на первую страницу, так что это тот, который я хочу кэшировать. По сути, я планирую до set первую страницу в кеше при каждой записи и get, когда зрители хотят ее использовать. У меня есть опции redis и memcache в качестве кеша.

Мой вопрос заключается в том, как кэшировать и обслуживать только на первой странице. Мой незашифрованный код выглядит следующим образом:

#object_list has up to 1000 object ids at a time 
paginator = Paginator(object_list, 20) #pass list of obj ids & no. of objs/page 
page = request.GET.get('page', '1') 
try: 
    page = paginator.page(page) 
except PageNotAnInteger: 
    # If page is not an integer, deliver first page. 
    page = paginator.page(1) 
except EmptyPage: 
    # If page is out of range (e.g. 9999), deliver last page of results. 
    page = paginator.page(paginator.num_pages) 
page_contents = retrieve_posts(page.object_list) #retrieve 20 objects 

ответ

1

Следующие попытки будут проверять кеш, если номер страницы один. Если он не найден, запрос будет отправлен в базу данных.

page = request.GET.get('page', '1') 
if page == '1': 
    cached_page = cache.get('cached_page',None) 
    if cached_page: 
     return cached_page 

#object_list has up to 1000 object ids at a time 
paginator = Paginator(object_list, 20) #pass list of obj ids & no. of objs/page 
try: 
    page = paginator.page(page) 
except PageNotAnInteger: 
    # If page is not an integer, deliver first page. 
    page = paginator.page(1) 
except EmptyPage: 
    # If page is out of range (e.g. 9999), deliver last page of results. 
    page = paginator.page(paginator.num_pages) 

page_contents = retrieve_posts(page.object_list) #retrieve 20 objects 
if page == '1': 
    cache.set('cached_page',page_contents) 

Непонятно, каков ваш запрос. Но если у вас нет убедительных доказательств того, что это медленный запрос, это преждевременная оптимизация. Получение элементов из базы данных с использованием первичных ключей происходит очень быстро. Так как вы должны сделать недействительным ваш кэш два раза в секунду, это накладные расходы могут сделать это не стоит усилий.

+0

Эй, там! Я попробую и вернусь к вам с точными критериями и т. Д. Действительно, недействительность кэша может быть узким местом здесь. Мне было интересно, подходят ли memcached или redis для микрокашинга такого типа. –

+0

memcached, вероятно, лучше – e4c5

+0

Так как это многопоточность, может ли быть какой-либо риск условий гонки в этом конкретном сценарии? –