繁体   English   中英

在 Django 中为分页视图的第一页使用缓存

[英]Employing caching for the first page of a paginated view in Django

我有一个分页的 Django 论坛,用户的帖子根据最近的发布时间累积。 我每页显示 20 个帖子。 在高峰时间,每约 2 秒保存一篇新帖子,而页面请求每秒最多查看 11 次。

我想通过引入缓存来减少数据库命中。 我注意到大部分流量都到达了第一页——所以这是我想要缓存的。 本质上,我计划在每次写入时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,以下将尝试检查缓存。 如果未找到,则会向数据库发出请求。

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)

目前尚不清楚您的查询集是什么样的。 但是除非您有令人信服的证据表明这是一个缓慢的查询,否则这是过早的优化。 使用主键从数据库中检索项目非常快。 由于您必须每秒两次使缓存无效,因此这种开销可能不值得付出努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM