博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 缓存方案
阅读量:7051 次
发布时间:2019-06-28

本文共 3635 字,大约阅读时间需要 12 分钟。

在大型网站上,如果访问的流量很多,又有很多动态的内容,这样每次获取一个信息都要去访问数据库,效率就会比较低下。这种情况下,一般都会使用缓存机制,首先去缓存里面找,如果有信息,那么直接获取;没有的话才去数据库获取,然后在缓存里面生成一个数据可以给下一次访问使用。

Django里面支持5种常见的缓存设置。

  • 开发测试

  • 本地内存

  • 文件

  • 数据库

  • Memcached(或者Redis)

这些配置都是在settings.py里面配置的。

开发测试,如果希望生产环境配置缓存,测试不需要,那么只需设置为dummycache就行了,他不做任何操作

1
2
3
4
5
6
7
8
9
10
CACHES 
= 
{            
 
'default'
: {                
     
'BACKEND'
'django.core.cache.backends.dummy.DummyCache'
,     
# 引擎
     
'TIMEOUT'
300
,                                               
# 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
     
'OPTIONS'
:{                    
         
'MAX_ENTRIES'
300
,                                       
# 最大缓存个数(默认300)
         
'CULL_FREQUENCY'
3
,                                      
# 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)                },                'KEY_PREFIX': '',                                             # 缓存key的前缀(默认空)
         
'VERSION'
1
,                                             
# 缓存key的版本(默认1)
         
'KEY_FUNCTION' 
函数名                                      
# 生成key的函数(默认函数会生成为:【前缀:版本:key】)            }
        
}

本地内存

1
2
3
4
5
6
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.locmem.LocMemCache'
,
        
'LOCATION'
: os.path.join(BASE_DIR,
'cache'
)
    
}
}

文件

1
2
3
4
5
6
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.filebased.FileBasedCache'
,
        
'LOCATION'
: os.path.join(BASE_DIR,
'cache'
)
    
}
}

数据库

1
2
3
4
5
6
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.db.DatabaseCache'
,
        
'LOCATION'
: os.path.join(BASE_DIR,
'cache'
)
    
}
}

Memcache 或者Redis,我们甚至可以同时设置多个不同的cache位置

CACHES = {    "redis": {        "BACKEND": "redis_cache.cache.RedisCache",        "LOCATION": "127.0.0.1:6379",        "OPTIONS": {            "CLIENT_CLASS": "redis_cache.client.DefaultClient",        }    },    'memcache': {        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',        'LOCATION': '127.0.0.1:11211',        'options': {            'MAX_ENTRIES': 1024,        }    },     'default': {        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',        'LOCATION': 'unique-snowflake',        'options': {            'MAX_ENTRIES': 1024,        }    }}

如何应用呢?

Django 提供了3个级别的应用。

全部缓存

这种方式需要添加两条中间件,注意一上一下的

settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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'
,
]
 
 
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.filebased.FileBasedCache'
,
        
'LOCATION'
: os.path.join(BASE_DIR,
'cache'
)
    
}
}

创建一个文件夹来存放缓存

views.py

1
2
3
4
def 
cache(request):
    
import 
time
    
ctime 
= 
time.time()
    
return 
render(request, 
'cache.html'
, {
'ctime'
: ctime})

cache.html

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<
html 
lang
=
"en"
>
<
head
>
    
<
meta 
charset
=
"UTF-8"
>
    
<
title
></
title
>
</
head
>
<
body
>
    
<
h1
>{
{ ctime }}</
h1
>
    
<
h1
>{
{ ctime }}</
h1
>
</
body
>
</
html
>

这样子整个页面都给缓存了

如果希望更细粒度的缓存,我们可以使用装饰器来装饰对应的视图函数

去掉中间件的设置,然后在我们的视图函数上

1
2
3
4
5
6
from 
django.views.decorators.cache 
import 
cache_page
@cache_page
(
10
)
def 
cache(request):
    
import 
time
    
ctime 
= 
time.time()
    
return 
render(request, 
'cache.html'
, {
'ctime'
: ctime})

这样数据缓存10秒之后才会重新刷新

我们还可以再更细粒度的缓存。这次我们在对应的模板文件上针对某个数据进行缓存。

去掉装饰器,然后在cache.html修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{% load cache %}
<!DOCTYPE html>
<
html 
lang
=
"en"
>
<
head
>
    
<
meta 
charset
=
"UTF-8"
>
    
<
title
></
title
>
</
head
>
<
body
>
    
<
h1
>{
{ ctime }}</
h1
>
    
<
h1
>{
{ ctime }}</
h1
>
{##}
     
{% cache 5 c1 %}
        
<
h1
>{
{ ctime }}</
h1
>
     
{% endcache %}
</
body
>
</
html
>

执行操作,上面两个数据是实时更新的,第三个数据缓存5秒之后才更新

本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1963363,如需转载请自行联系原作者
你可能感兴趣的文章
IBM:量子计算现在跟1940年代电脑差不多 更看重长远目标
查看>>
研究机构称独角兽更易获得融资 明后年或有大量企业IPO
查看>>
三星将斥资80亿美元收购美国哈曼国际
查看>>
纷享销客变“逍”客 缘何战略一再调整?
查看>>
立标准引导市场化 大数据产业将迎“洗牌期”
查看>>
软件测试建模:Google ACC
查看>>
《 FreeSWITCH权威指南》——1.4 信令
查看>>
Netflix正在消灭传统电视网络
查看>>
eMarketer:物联网正在重塑快速消费品行业
查看>>
Deeplearning4j:如何建设深度学习开源社区
查看>>
移动安全身份认证厂商及产品盘点
查看>>
J2EE的13个规范
查看>>
记录-使用CSDN-markdown编辑器
查看>>
Windows 10将很快允许用户在未安装应用之前首先进行体验
查看>>
巧测字段最大长度
查看>>
TuShare(2):使用TuShare,抓取股票数据并存储到数据库
查看>>
还在跑分?什么样的固态硬盘才是好产品
查看>>
AI进入安防 安防的未来是怎样?
查看>>
《敏捷可执行需求说明 Scrum提炼及实现技术》—— 2.3 要求所有干系人参与
查看>>
Mozilla将从3月31日起实行插件“点击运行”机制
查看>>