【django】缓存机制

缓存机制

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,若某个时间内再次发生同一个请求,则不再去执行请求响应过程,而直接从内存或高速缓存系统中获取该请求的响应内容返回给用户。

缓存方式

Django提供了5种不同的缓存方式:

  • Memcached:高性能的分布式内存对象缓存系统,用于动态网站,以减轻数据库负载。使用Memcache需要安装系统服务器,适合超大型网站使用。
  • 数据库缓存:缓存信息存储在网站数据库的缓存表中,缓存表可以在项目的配置文件中配置,适合大中型网站使用。
  • 文件系统缓存:缓存信息以文本文件格式保存,适合中小型网站使用。
  • 本地内存缓存:Django默认的缓存保存方式,只适用于项目开发测试。
  • 虚拟缓存:Django内置的虚拟缓存,实际上只提供缓存接口,并不能储存缓存数据,只用于开发测试。

使用缓存

想要使用缓存机制需要在配置文件settings.py中设置缓存的相关配置。

缓存相关配置

Memcached配置

CACHES = {
    'default':{
		# 以下配置必须配置

		# 配置缓存引擎        
        # 使用python-memcached模块连接Memcached:
        'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
        # 使用pylibmc模块连接Memcached:
        #'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
        # 配置Memcached服务器的IP地址:
        'LOCATION':[
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
		# 可选配置:
		
		#设置缓存的生命周期,以秒为单位,若为None,则永不过期
        'TIMEOUT': 60,
        'OPTIONS':{
            #最大缓存记录的数量
            'MAX_ENTRIES': 1000,
            #当缓存到达最大数量之后,设置剔除缓存的数量
            'CULL_FREQUENCY': 3,
        }
    }
  
    
}

数据库缓存配置

#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
    'default':{
		# 配置缓存引擎        
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        # 数据表的命名
        'LOCATION':'my_cache_table',
    }
}

文件系统缓存

CACHES = {
    'default':{
        # 配置缓存引擎
        'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
        # 文件保存的路径
        'LOCATION':'d:/mysite',
    }
}

本地内存缓存

CACHES = {
    'default':{
        #配置缓存引擎
        'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
        # 对存储器命名,用于识别多个存储器
        'LOCATION':'unique-snowflake',
    }
}

虚拟缓存

CACHES = {
    'default':{
        #配置缓存引擎
        'BACKEND':'django.core.cache.backends.dummy.DummyCache',
    }
}

通过上面的配置完成了使用缓存的第一步,接下来需要创建数据缓存表,缓存数据表的生成依赖于配置文件中DATABASES的配置信息,如果DATABASES配置了多个数据库,那么缓存数据表默认在DATABASES 的default的数据库中生成。

创建数据缓存表

python manage.py createcachetable

指定缓存作用区域

缓存可以在四个地方指定,根据作用对象不同划分,可以根据实际业务需求选择使用

全站缓存

将缓存作用于整个网站的全部页面。一般情况下不采用这种方式实现,会对数据库或Memcached造成极大的压力。

全站缓存作用于整个网站,当用户向网站发送请求时,首先经过Django的中间件进行处理。因此,使用全站缓存应在Django的中间件中配置。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    #配置全站缓存
    'django.middleware.cache.UpdateCacheMiddleware',
    #使用中文
    'django.middleware.locale.LocaleMiddleware',
    #配置全站缓存
    'django.middleware.cache.FetchFromCacheMiddleware',
]
#设置缓存的生命周期,若在缓存配置CACHES中设置TIMEOUT属性,则程序优先选择这里的设置
CACHE_MIDDLEWARE_SECONDS = 15
# #设置缓存数据保存在数据表my_cache_table中,属性值default来自于缓存配置CACHES的default属性
CACHE_MIDDLEWARE_ALIAS = 'default'
# #设置缓存表字段cache_key的值,用于同一个Django项目多个站点之间的共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'

视图缓存

视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和key_prefix,参数timeout是必选参数,其余两个是可选参数。

from django.shortcuts import render
from django.views.decorators.cache import cache_page
# cache与全站缓存CACHE_MIDDLEWARE_ALIAS相同
# key_prefix与全站缓存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(10, cache='default', key_prefix='mysite')
def index(request):
    return render(request,"index.html")

路由缓存

作用与视图缓存相同,但两者是有区别的。如有两个URL同时指向一个视图函数,分别访问这两个URL时,路由缓存会判断URL是否生成缓存而决定是否执行视图函数。

路由缓存主要在路由配置中实现,路由缓存cache_page有三个参数,分别是timeout、cache和key_prefix,参数timeout是必选参数,其余两个参数是可选参数

from django.conf.urls import url
from app1 import views
from django.views.decorators.cache import cache_page
urlpatterns = [
    url(r'^index/', cache_page(10,cache='default', key_prefix='mysite')(views.index)),

模板缓存

对模板某部分的数据设置缓存,常用于模板内容变动较少的情况。通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% load cache %}
    {% cache 10 mysite %}
    <h1>index</h1>
    {% endcache  %}
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章