我有一个分页的Django论坛,用户根据最近发布的时间累积帖子。我每页显示20个帖子。在高峰时段,每隔约2秒就会保存一个新帖子,而每秒最多可以查看11次页面。
我想通过引入缓存来减少数据库命中。我注意到大部分流量都在第一页上出现 - 所以这就是我要缓存的流量。从本质上讲,我计划在每次写入时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
答案 0 :(得分: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)
不清楚您的查询集是什么样的。但除非你有令人信服的证据证明这是一个缓慢的查询,否则这是不成熟的优化。使用主键从数据库中检索项目非常快。由于您必须每秒两次使缓存无效,因此这种开销可能使其不值得付出努力。