python - 在 Django 中对分页 View 的第一页使用缓存

标签 python django caching pagination memcached

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

我想通过引入缓存来减少数据库命中。我注意到大部分流量都会到达第一页 - 所以这是我想要缓存的页面。本质上,我计划在每次写入时设置缓存中的第一页,并在观众想要使用它时获取它。我可以选择使用 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)

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

关于python - 在 Django 中对分页 View 的第一页使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949189/

相关文章:

asp.net - 在asp.net mvc中实现静态文件缓存

python - 如何使用python使用anaconda?

python - 将 vlen 与 h5py 一起使用时出现莫名其妙的行为

python 否定搜索

django - 制作 Q 对象的正确方法,它过滤 Django QuerySet 中的所有条目?

PHP - 静态类和缓存类

python - 使用终端处理 AppScale 的数据存储区

django - 使用docker将Django应用程序部署到heroku时在何处运行collectstatic?

django - 将 DataTables 插件与 Django 框架集成

caching - 当我使用略多于 64kb 的常量缓存时,为什么我的内核不会失败? (OpenCL/CUDA)