一、什么是缓存
Django缓存就是保存一些大量、重复访问的数据在内存或文件中,这样有用户重复请求时直接从内存或文件中返回,这样就不用重复频繁的访问数据库获取,提高执行效率。
二、Django缓存的方式
Django提供了5种缓存方式:
开发调试:django.core.cache.backends.dummy.DummyCache
本地内存:django.core.cache.backends.locmem.LocMemCache
本地文件:django.core.cache.backends.filebased.FileBasedCache
数据库:django.core.cache.backends.db.DatabaseCache
Memcache缓存:
python-memcached模块:django.core.cache.backends.memcached.MemcachedCache
pylibmc模块:django.core.cache.backends.memcached.PyLibMCCache
三、配置Django Cache
a、开发调试(实际内部不做任何动作)
|
1
2
3
4
5
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.dummy.DummyCache'
,
}
}
|
b、本地内存
|
1
2
3
4
5
6
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.locmem.LocMemCache'
,
'LOCATION'
:
'unique-snowflake'
,
}
}
|
c、本地文件
|
1
2
3
4
5
6
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.filebased.FileBasedCache'
,
'LOCATION'
: os.path.join(BASE_DIR,
"cache"
),
}
}
|
d、数据库
缓存连哪个数据库,就看你在配置文件中DATABASES定义了使用哪个数据库!
|
1
2
3
4
5
6
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.db.DatabaseCache'
,
'LOCATION'
:
'cache_table'
,
}
}
|
命令行中运行:python3 manage.py createcachetable命令创建数据库表
e、Memchache(python-memcached模块)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.memcached.MemcachedCache'
,
'LOCATION'
:
'10.10.10.10: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'
: [
(
'10.10.10.10:11211'
,
10
),
(
'10.10.10.11:11211'
,
20
),
]
}
}
|
f、Memchache(pylibmc模块)
|
1
2
3
|
'BACKEND'
:
'django.core.cache.backends.memcached.PyLibMCCache'
|
四、Cache参数
除了上面所写的参数外,还有一些额外的参数来控制缓存行为,这些参数以键值对的形式写在cache setting中。
TIMEOUT:缓存的默认过期时间,以秒为单位,默认是300秒。
OPTIONS:
MAX_ENTRIES:缓存允许的最大条目数,超过这个数则旧值会被删除,默认是300。
CULL_FREQUENCY:当达到MAX_ENTRIES 的时候,被删除的条目比率。 实际比率是1/CULL_FREQUENCY,默认是3。
KEY_PREFIX:缓存key的前缀(默认空)
VERSION:缓存key的版本(默认1)
KEY_FUNCTION:生成key的函数(默认函数会生成为:[前缀:版本:key])
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.filebased.FileBasedCache'
,
'LOCATION'
: os.path.join(BASE_DIR,
"cache"
),
'TIMEOUT'
:
300
,
'OPTIONS'
:{
'MAX_ENTRIES'
:
300
,
'CULL_FREQUENCY'
:
3
,
},
'KEY_PREFIX'
: '',
'VERSION'
:
1
,
'KEY_FUNCTION'
: 函数名,
}
}
|
五、使用Django Cache
a、全站使用(对所有的视图函数生效)
|
1
2
3
4
5
|
MIDDLEWARE
=
[
'django.middleware.cache.UpdateCacheMiddleware'
,
'django.middleware.cache.FetchFromCacheMiddleware'
,
]
|
用户请求过来时,先跳过UpdateCacheMiddleware中间件,执行其他中间件,最后到FetchFromCacheMiddleware中间件时。如果缓存内容已存在,则直接返回给用户;如果缓存内容不存在则获取并返回数据。当返回给用户之前,往回执行到UpdateCacheMiddleware中间件,判断内容是否已经缓存,如果不存在则缓存。
b、单独视图缓存
views.py
|
1
2
3
4
5
6
7
|
from
django.views.decorators.cache
import
cache_page
import
time
@cache_page
(
5
)
def
cache(req):
time_now
=
time.time()
return
render(req,
"cache.html"
,
locals
())
|
cache.html
|
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
<meta charset
=
"UTF-8"
>
<title>Title<
/
title>
<
/
head>
<body>
{{ time_now }}
<
/
body>
<
/
html>
|
c、视图局部缓存
views.py
|
1
2
3
4
5
|
import
time
def
cache2(req):
time_now
=
time.time()
return
render(req,
"cache2.html"
,
locals
())
|
cache2.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{
%
load cache
%
}
<!DOCTYPE html>
<html lang
=
"en"
>
<head>
<meta charset
=
"UTF-8"
>
<title>Title<
/
title>
<
/
head>
<body>
{{ time_now }}
<hr>
{
%
cache
5
k1
%
}
{{ time_now }}
{
%
endcache
%
}
<
/
body>
<
/
html>
|
视图的局部缓存可以令模板中的一部分内容进行缓存,局部缓存时首先要引入{% load cache %},其次在{% cache cache_time cache_key %} cache_value {% endcache %}中填入内容。cache_time是缓存的时间以秒为单位,因为缓存时以键值对存储所以cache_key设置缓存内容的key,这个key自己定义。
本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1978174如需转载请自行联系原作者
daibaiyang119