Django 配置缓存机制
**Django ** 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。
缓存系统工作原理
对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。
一般来说我们用 Django 来搭建一个网站,要用到数据库等。
from django.shortcuts import render
def index(request):
# 读取数据库等 并渲染到网页
# 数据库获取的结果保存到 queryset 中
return render(request, 'index.html', {'book_list':book_list})
像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。
当使用了cache后,访问情况就变化了。
from django.shortcuts import render
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index(request):
# 读取数据库等 并渲染到网页
return render(request, 'index.html', {'book_list':book_list})
# 访问一个网址时, 尝试从 cache 中找有没有缓存内容
# 如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。
Django settings 中 默认cache
也就是默认利用本地的内存
来当缓存,速度很快。
当然可能出来内存不够用的情况
from django.conf import settings
print(settings.CACHES)
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
{
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
下面我们就来介绍一下各种缓存的配置:
缓存配置
利用文件系统来缓存
这个很简单,就是将数据缓存在指定的目录中。配置如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache', # linux 中的目录,前提目录必须存在
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 1000
}
}
}
使用Memcache来缓存:
Memcached 是目前 Django 可用的最快的缓存,
但是memcache需要你的服务器支持,也就是说需要有Memcache服务,
Linux系统安装Memcached,首先要先安装libevent库。
$ yum -y install libevent ibevent-devel 联网自动下载安装
$ yum -y install install memcached linux安装memcached 的方法我就不说了,自己去找去
然后需要pip3安装Memcached的插件Python-mencached 和 pylibmc
$ pip3 install Python-mencached
$ pip3 install pylibmc
最后在setting.py配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}
使用Local-memory来缓存:
这种缓存方式会将数据保存在服务器的内存中。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}
最推荐的缓存方式是Memcache
或者Local-memory
,要不就是文件缓存
Django使用Redis作为缓存
redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,
安装该数据库是为了做服务器缓存。以下两种情况都适合使用服务器缓存:
1)数据非经常更新。若每次都从硬盘读取一次,浪费服务器资源、拖慢响应速度。
2)数据更新频率较高,服务器负担比较大。
这些数据只需每天更新一次。而我每次都从数据库获取相应的数据,计算统计排行情况和阅读数。很明显浪费服务器资源,浪费时间。解决方法是定时统计一次数据,保存到数据库或文件中。每次读取数据从中获取。
若保存到数据库,还需要额外建立一张对应的表存储数据。在Django中建立表通常做法是建立一个模型。看似简单,问题调试麻烦、开发时长久。所以我一直拖着没处理该问题。毕竟一开始访问量不是很多。后来不少网友访客打开慢(当然服务器在国外也是个原因),查了资料发现Redis内存数据库。可以将数据写入到内存,再进行读写。减少计算量,可以有效提高服务器响应速度。
这么一来,我就不用创建新表创建模型。直接将数据写入缓存,定时更新。获取数据从服务器缓存获取即可。
下面我就来介绍如何在Django中配置使用redis数据库!
安装django-redis
pip3 install django-redis
settings配置
# redis 缓存数据库配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.32.130:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES":True,
"PASSWORD": "root",
}
}
}
views视图中使用redis
# 视图中使用redis缓存数据库
from django_redis import get_redis_connection
conn = get_redis_connection('default')
全站缓存
在django中的settings配置文件中设置
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
单视图缓存
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def cache(request):
# return HttpResponse('hello') # 当我们第一次访问的时候,redis中已经存在了一个hello的值,当我们发送的数据发生改变的时候,这时候因为过期时间还没到,不会清除缓存的信息。
return HttpResponse('hellodsafnjsakfaskfg')
在页面中局部进行缓存
- 使用cache模板标签来缓存模板的一个片段
- 需要两个参数:
- 缓存时间,以秒为单位
- 给缓存片段起的名称
步骤I. 引入TemplateTag
{% load cache %}
步骤II. 使用缓存
{% cache 5000 缓存key %} 缓存时间 5000秒
缓存内容
{% endcache %}
底层的缓存API
from django.core.cache import cache
设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear()