缓存
- 提升服务器响应速度
- 将执行过的操作数据存储下来,在一定时间内,再次获取数据的时候,直接从缓存中获取
- 比较理想的方案,缓存使用内存级缓存
- Django内置了缓存框架,并提供了几种常用的缓存
使用数据库进行缓存
1、创建缓存表
>>>python manage.py createcachetable my_cache_table
会发现数据库中自动创建好了my_cache_table的表:
2、缓存配置
settings.py中设置CACHES:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
'TIMEOUT': 60 * 5,
}
}
造一个news页面,模拟新闻条,views.py文件如下:
def news(request):
news_list = list()
for i in range(10):
news_list.append('最近发生了一件大事%d' % i)
time.sleep(5)
data = {
'news_list': news_list,
}
return render(request, 'news.html', context=data)
数据太少,无法体现缓存优势,用time.sleep(5)假装耗时操作。
3、缓存使用
- 在视图函数上增加装饰器
from django.views.decorators.cache import cache_page
@cache_page(30)
def news(request):
news_list = list()
for i in range(10):
news_list.append('最近发生了一件大事%d' % i)
time.sleep(0.5)
data = {
'news_list': news_list,
}
return render(request, 'news.html', context=data)
再次访问app/news网站,第一次会缓慢加载,第二次会立即显示出数据:
可以看到,数据库中增加了加密过的数据,并且制定了过期时间:
缓存流程图如下:
大致流程:
- 请求从客户端处走向views,然后走向cache中查看是否有数据,
- 发现没有数据,再经过models从db中获取数据
- 将获取到的数据保存一份到cache中 再从views经response返回到客户端;
- 如果从cache中发现数据,就直接将cache中的数据返回给客户端
依据这个流程,我们可以自行设计cache:
自己实现缓存
代码如下:
from django.core.cache import cache
# @cache_page(30)
def news(request):
result = cache.get("news")
if result:
return HttpResponse(result)
news_list = list()
for i in range(10):
news_list.append('最近发生了一件大事%d' % i)
time.sleep(0.5)
data = {
'news_list': news_list,
}
response = render(request, 'news.html', context=data)
cache.set("news", response.content, timeout=60)
return response
首先查看cache中是否存在相关数据,如果存在,直接将查询到的结果返回;
如果不存在,在正常的获取数据后,将"news"作为键,response.content作为值,设置cache。