一、浏览器的缓存机制
Cache-Control策略:
Cache-Control和Expires的作用相似,即指出当前资源的有效期,控制浏览器是直接从浏览器缓存获取数据还是发送Request到服务端获取数据,只不过Cache-Control的选择方式更多,设置详细,如果要同时设置,优先级高于Expires。
Cache-Control: max-age=10,即设置缓存存储的最大周期为10s,这和Date与Expires的差值相对应,private表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。
Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
二、Django中的缓存机制:
1.Django缓存原理
由于django是动态网站,所以当客户端发来请求时均会去对数据库进行相应的操作,当网站访问量大时,必然会更加耗时,最简单的解决方式是使用缓存,缓存将某个视图函数的返回值保存至内存或硬盘中。
django根据设置的缓存方式,浏览器第一次请求时,Cache会缓存响应的数据到硬盘或内存中,同时设置Response,当浏览器再次Request时,附带f-Modified-Since请求时间到django,django发现f-Modified-Since会先去参数后,与缓存中的过期时间比较,如果缓存时间比较新,则会重新请求数据,并缓存数据后返回Response给浏览器,如果缓存没有过期,则直接从缓存中获取数据,Response
给浏览器。
1.1、缓存设置
(1)设置中间件
1 ‘django.middleware.cache.UpdateCacheMiddleware‘, #必须设置在第一个位置 2 ...其他中间件... 3 ‘django.middleware.cache.FetchFromCacheMiddleware‘,#必须设置在最后一个位置
(2)通用设置
1 CACHE_MIDDLEWARE_ALIAS = ‘default‘ #缓存别名 2 CACHE_MIDDLEWARE_SECONDS = 0 #页面默认缓存时间,默认600 3 CACHE_MIDDLEWARE_KEY_PREFIX =‘www.xxx.com‘ #关键的前缀,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名 4 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #只有匿名的请求会被缓存,这是一个禁用缓存非匿名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件
1.2、Django的缓存方式
(1)内存缓存
利用本地内存缓存,这样缓存是多进程和线程安全的。
1 # 此缓存将内容保存至内存的变量中 2 # 配置: 3 CACHES = { 4 ‘default‘: { 5 ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘, 6 ‘LOCATION‘: ‘unique-snowflake‘, 7 } 8 }
缓存LOCATION用来区分不同的内存存储,如果只有一个本地内存缓存,可以忽略,如果有多
个时,需要命名区分。
每个进程都有它们自己的私有缓存实例,所以跨进程缓存是不可能的,因此,本地内存缓存不
是特别有效率,建议只在内部开发测试时使用,不建议生产环境中使用。
(2)Memcached
此缓存使用python-memcached模块连接Memcache,可以支持多个服务器上的Memcached
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‘: [ ‘210.32.26.202:11211‘, ‘210.32.26.203:11211‘, ] } }
(3)数据库
注意:数据库缓存使用的是配置文件中的数据库作为默认数据库,如果想使用其他数据库,需要修改数据库缓存表
# 此缓存将内容保存至数据库 # 配置: CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘, ‘LOCATION‘: ‘my_cache_table‘, # 数据库表 } } # 注:执行创建表命令 python manage.py createcachetable 表名
(4)数据库
注意:数据库缓存使用的是配置文件中的数据库作为默认数据库,如果想使用其他数据库,需要修改数据库缓存表
# 此缓存将内容保存至文件 # 配置: CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘, ‘LOCATION‘: ‘/var/tmp/django_cache‘, } }
1.3、缓存应用
(1)全站应用
即使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存。
(2)单独视图应用
方式一: from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ... 方式二: from django.views.decorators.cache import cache_page urlpatterns = [ url(r‘^foo/([0-9]{1,2})/$‘, cache_page(60 * 15)(my_view)), ]
(3)局部视图应用
a. 引入TemplateTag {% load cache %} b. 使用缓存 {% cache 5000 缓存key %} 缓存内容 {% endcache %}