2017-01-31 24 views
1

私はページングされたDjangoフォーラムを持っています。ユーザーが最近ポスティングした時点で投稿が蓄積されます。私はページあたり20の記事を表示します。ピーク時には、新しい投稿が〜2秒ごとに保存されますが、ページは1秒あたり最大11回閲覧するよう要求されます。Djangoでページ区切りビューの最初のページにキャッシングを使用する

キャッシングを導入することでDBヒットを減らしたいと考えています。トラフィックのほとんどが最初のページに当たっていることに気がつきました。これがキャッシュしたいものです。基本的には、各書き込み時にキャッシュの最初のページsetに、視聴者がそれを消費したいときは常にgetに設定します。私はredismemcacheのオプションをキャッシュバックエンドとして持っています。

私の質問は、最初のページの最初のページをキャッシュして提供する方法です。キャッシュされていないコードは次のとおりです。

#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

以下は、ページ番号が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) 

クエリーセットがどのようなものかはっきりしません。しかし、これが遅いクエリであることを示す魅力的な証拠がない限り、これは時期尚早の最適化です。主キーを使用してデータベースからアイテムを取得することは非常に高速です。キャッシュを1秒に2回無効にする必要があるため、そのオーバーヘッドはその努力に値するものではありません。

+0

ねえ!私はそれを試し、正確なベンチマークなどであなたに戻ってきます。実際、ここではキャッシュの無効化がボトルネックになる可能性があります。私はmemcachedかredisがこの種のマイクロキャッシングに適しているかどうか疑問に思っていました。 –

+0

memcachedはおそらくもっと良いでしょう – e4c5

+0

これはマルチスレッドなので、この特定のシナリオでは競合状態の危険性がありますか?キャッシュを持つ –

関連する問題