私はページングされたDjangoフォーラムを持っています。ユーザーが最近ポスティングした時点で投稿が蓄積されます。私はページあたり20の記事を表示します。ピーク時には、新しい投稿が〜2秒ごとに保存されますが、ページは1秒あたり最大11回閲覧するよう要求されます。Djangoでページ区切りビューの最初のページにキャッシングを使用する
キャッシングを導入することでDBヒットを減らしたいと考えています。トラフィックのほとんどが最初のページに当たっていることに気がつきました。これがキャッシュしたいものです。基本的には、各書き込み時にキャッシュの最初のページ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
ねえ!私はそれを試し、正確なベンチマークなどであなたに戻ってきます。実際、ここではキャッシュの無効化がボトルネックになる可能性があります。私はmemcachedかredisがこの種のマイクロキャッシングに適しているかどうか疑問に思っていました。 –
memcachedはおそらくもっと良いでしょう – e4c5
これはマルチスレッドなので、この特定のシナリオでは競合状態の危険性がありますか?キャッシュを持つ –