Django 缓存系统
网站访问效率优化的一大方法,缓存(cache)。缓存针对动态网站起作用居多,动态网站的数据来源于数据库或者其他的存储容器。当请求页面的时候,我们需要首先查询数据,让后动态的渲染数据,当数据量大并且访问频繁的时候,容易导致响应效率变第,服务器压力变大。
所以,在第一次访问,就将数据库查询的数据先放到一个地方,这个地方可以是内存,数据库,本地当中,然后,之后访问同样的数据的时候,直接访问刚才存放的地方,而不是重新查询,那么这种技术就叫做缓存。
存储缓存常用的方式:
- memcache缓存
- 本地缓存
- 数据库缓存
使用缓存的方式:
- 视图粒度缓存
- 路由粒度缓存
- 页面粒度缓存
- 全栈粒度缓存
- 底层缓存接口
1、memcache缓存:
分布式的高速缓存系统,通常用来提高网站的访问速度。
在本地安装memcache服务。
下载解压缓存包,在解压目录下,以管理员身份打开命令行。
memcached.exe -d install
进入windows服务,开启memcache服务
安装python-memcached
到global_settings当中复制cache配置结构到自己的settings当中进行配置
在settings当中配置memcache缓存
# The cache backends to use.
# CACHES = {
# 'default': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 默认使用本地缓存
# }
# }
# 缓存配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 声明使用memcache缓存
'LOCATION': [
'127.0.0.1:11211'
] # 配置cache地址
}
}
使用视图颗粒方式进行memcache缓存
# 导入cache_page页面
from django.views.decorators.cache import cache_page
使用路由颗粒方式进行memcache缓存:
在开发过程当中,有可能使用不同的路由指向同一个视图。比如商品的上架和下架功能,不同的路由,指向同一个视图,这个时候就需要针对路由进行缓存
# 导入cache_page页面
from django.views.decorators.cache import cache_page
2、本地缓存:
将缓存内容保存至内存中,必须要考虑的内存使用情况
# The cache backends to use.
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',# 默认使用本地缓存
}
}
3、数据库缓存:
①Redis数据库缓存
需要提前安装的插件
pip install django-redis
pip install redis
本地启动Redis数据库
redis-server.exe redis.windows.conf
settings配置Redis数据库缓存
# Redis数据库缓存配置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache', # 声明使用redis数据库缓存
'LOCATION': [
'redis://127.0.0.1:6379/1'
], # 配置cache地址
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient'
}
}
}
创建对应存放缓存的数据表
python manage.py createcachetable Tab_name
②MySQL或sqlite默认数据库缓存配置
settings配置:
# 使用默认数据库缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 使用Django默认数据库缓存
'LOCATION': 'cache_table' # 存放缓存的表
}
}
同样创建存放缓存的数据表
python manage.py createcachetable Tab_name
然后使用路由或视图的方式应用缓存
最后访问使用缓存的视图,触发
注意修改时区为亚洲上海
全栈粒度缓存方式
Django 全栈缓存通过缓存配置还有中间件来声明
首先配置settings的中间件,配置的位置必须一首一尾
- 用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
- 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
- 请求来了,是从上到下入走中间件;响应的时候是从下到上走中间件。因此,获取页面放在最后,保存页面放最前面
MIDDLEWARE = [
# 放页面的时候,应该放在最前面
'django.middleware.cache.UpdateCacheMiddleware',
'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.FetchFromCacheMiddleware', #最后
]
Settings当中还需要配置
# 全栈缓存配置,全局缓存
CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHE_MIDDLEWARE_SECONDS = 600 # 全局缓存时间
CACHE_MIDDLEWARE_KEY_PREFIX = ''
同一个django下当多个网站共享缓存的时候,可以将该配置指向当前网站的识别,
这个识别通常是域名,也可以是其他可以唯一标识该网站的字符,目的为了防止多
个网站共享缓存,缓存混淆
CACHE_MIDDLEWARE_SECONDS = 600
全局缓存的寿命
局部页面缓存方式
{% load cache %} # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% cache 50 缓存key(别名) %} # 这个图片50s内会在缓存里中取
<img src="http://pic16.nipic.com/20111006/6239936_092702973000_2.jpg" alt="加载失败">
{% endcache %}
</body>
</html>
底层缓存接口方式
set 设置cache 参数:key, value, timeout_seconds
get 获取 cache 参数:key
add 添加 cache 参数:key, value, timeout_seconds
例子:
from django.core.cache import cache
def test(request):
store_data = cache.get("store_data")
if store_data:
store_data = store_data
else:
data = Store.objects.all()
cache.set("store_data",data,30)
# cache.add("store_data", data, 30) #add只会添加一个缓存,不会修改已经存在的缓存
store_data = data
return render(request,"store/TestCache.html",locals())