文章目录
一、什么是缓存
简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中
- 当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间
- 需要知道的是,缓存里面的数据一般都设置有超时时间,缓存一般用在数据变化不大,实时率不高的情况下。
由于Django是动态网站,所有每次请求均会去数据进行相应的操作
- 当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存
- 缓存将一个某个views的返回值保存至内存或者memcache中
- 5分钟内(默认配置)再有人来访问时,则不再去执行view中的操作
- 而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
二、Django中的6种缓存方式
- 内存缓存
- 文件缓存
- 数据库缓存
- Memcache缓存(使用python-memcached模块)
- Memcache缓存(使用pylibmc模块)
- redis缓存
经常使用到的有文件缓存以及redis缓存
三、Django缓存的配置
这里就只写文件缓存、内存缓存和数据库缓存配置了,其他想要了解可以自行查找
内存缓存(默认情况下就是缓存到内存中)
settings.py配置文件中
python
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
文件缓存(把缓存数据存储在文件中)
settings.py配置文件中
python
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': '/var/tmp/django_cache', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
数据库缓存(把缓存数据存储在数据库中)
settings.py配置文件中
python
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎
'LOCATION': 'cache_table', # 数据库表
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
注意,创建缓存的数据库表使用的语句:
python
python manage.py createcachetable
四、Django中的缓存应用(三种粒度)
全站缓存(利用Django中间件)
既然是全站缓存,当然要使用Django中的中间件
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用
FetchFromCacheMiddleware
获取内容并返回给用户。当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware
会将缓存保存至Django的缓存之中,以实现全站缓存
python
缓存整个站点,是最简单的缓存方法
需要在settings配置文件中的中间件中加入 "update(放在最前面)" 和 "fetch(放在最后面)" 中间件
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
........
'django.middleware.cache.FetchFromCacheMiddleware'
] '"update" 必须配置在第一个位置"fetch" 必须配置在最后一个位置'
视图函数缓存
python
import datetime
from django.views.decorators.cache import cache_page 导入缓存装饰器模块
@cache_page(timeout=10) 装饰器
def demo2(request):
ctime = datetime.datetime.now()
return render(request,'demo2.html',{'ctime':ctime})
局部缓存
python
放在模版层使用的:
{% load cache %}
<h3 style="color: green">不缓存:-----{{ ctime }}</h3>
{% cache 2 'name' %}
<h3>缓存:-----:{{ ctime }}</h3>
{% endcache %}