首页 > 其他 > 详细

django -- 缓存

时间:2019-09-20 02:27:42      阅读:89      评论:0      收藏:0      [点我收藏+]

缓存的介绍

我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程:

接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> 模版渲染 -> 返回请求

如果有大量请求来时,都要执行这个操作,那会大大增加服务器的压力,最简单的方法就是设置一个缓存,在一定的时间内,如果访问这个视图函数,则使用缓存数据。

比如我们使用的博客园,有一个分类功能,我们增加一个分类,然后新打开一个窗口,删除那个分类,在原来的窗口刷新查看,新添加的分类还存在,当超过一定的时间之后,在刷新页面,就不存在了,这就是缓存。

什么样的数据适合缓存呢?

不经常更改的数据,并且要设置一个超时时间

缓存放到内存

先在settings.py文件里配置缓存

CACHES = {
    default: {
        BACKEND: django.core.cache.backends.locmem.LocMemCache,  # 缓存保存到内存里面
        LOCATION: unique-snowflake,
        TIMEOUT: 600,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        OPTIONS: {
            MAX_ENTRIES: 300,  # 最大缓存个数(默认300)
            CULL_FREQUENCY: 2,  # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3)
        },
    }
}

视图使用缓冲

from django.shortcuts import render
from app01 import models
from django.views.decorators.cache import cache_page


@cache_page(30)  # 使用缓冲,参数为缓冲的有效期,30s
def user_list(request):
    users = models.User.objects.all()
    return render(request, user_list.html, {"users": users})

这样就给user_list使用上了缓存,缓存的过期时间为30秒,如果这里不填,则使用配置里的过期时间。

当请求第一次来的时候,访问这个视图函数,30s之内访问,都会去视图里直接拿取超过30s之后才会再次执行视图函数

路由使用缓存

from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r^user_list, cache_page(60 * 15)(my_view)),
        ]

缓存放到文件

上面我们是把缓存放到内存里,我们也可以放到文件里面,只需要更改配置里的代码即可

CACHES = {
    default: {
        BACKEND: django.core.cache.backends.filebased.FileBasedCache,  # 缓存保存到文件
        LOCATION: F:\cache,  # 缓存的目录路径,给个目录就可以了
        TIMEOUT: 600,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        OPTIONS: {
            MAX_ENTRIES: 300,  # 最大缓存个数(默认300)
            CULL_FREQUENCY: 2,  # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3)
        },
    }
}

使用和上面的使用方法一样

缓存放到数据库

    # 配置:
        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.db.DatabaseCache,
                LOCATION: my_cache_table, # 数据库表
            }
        }

    # 注:执行创建表命令 python manage.py createcachetable

既然都是在数据库里读取数据,那把缓存放到数据库里和直接读数据库有什么区别呢?把缓存放到数据库里,存的是结果,少了查询和渲染的过程,会比查数据库快

Memcache缓存

# 此缓存使用python-memcached模块连接memcache

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: 127.0.0.1:11211,
        }
    }

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: unix:/tmp/memcached.sock,
        }
    }   

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: [
                172.19.26.240:11211,
                172.19.26.242:11211,
            ]
        }
    }

缓存的应用

前面说了给某一个视图函数使用缓存,这样的话是比较麻烦的,可以给所有的视图使用缓存

我们可以使用中间件来设置缓存,使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存

MIDDLEWARE = [
        django.middleware.cache.UpdateCacheMiddleware,
        # 其他中间件...
        django.middleware.cache.FetchFromCacheMiddleware,
    ]

CACHE_MIDDLEWARE_SECONDS = ""  # 超时时间
   

技术分享图片

 

django -- 缓存

原文:https://www.cnblogs.com/zouzou-busy/p/11481208.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!