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

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

一、什么是缓存

    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
# 使用IP和端口连接远端单个Memcache服务器
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.memcached.MemcachedCache'
,
        
'LOCATION'
'10.10.10.10:11211'
,  
# 远端Memcache服务器IP和端口
    
}
}
 
# 使用本地socket文件连接本地Memcache服务器
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.memcached.MemcachedCache'
,
        
'LOCATION'
'unix:/tmp/memcached.sock'
,  
# 本地socket文件
    
}
}   
 
# 连接远端多个Memcache服务器,做分布式缓存
CACHES 
= 
{
    
'default'
: {
        
'BACKEND'
'django.core.cache.backends.memcached.MemcachedCache'
,
        
'LOCATION'
: [
            
(
'10.10.10.10:11211'
10
),  
# 设置远端Memcache服务器IP和端口以及优先级
            
(
'10.10.10.11:11211'
20
),
        
]
    
}
}

f、Memchache(pylibmc模块)

1
2
3
# 使用方法同上面一模一样,只需把引擎换成pylibmc模块的就可以了
 
'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
)  
# 缓存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
你可能感兴趣的文章
Spring Boot 参考指南(开发Web应用程序)
查看>>
策略模式总结
查看>>
关于作用域插槽的理解
查看>>
javascript块级作用域处理闭包和释放内存的垃圾回收
查看>>
快速入门React
查看>>
正则表达式语法入门
查看>>
关于顶级、一级、二级域名如何理解?
查看>>
为什么点积等价于投影后的乘积?
查看>>
关于pug的笔记
查看>>
系统优化怎么做-Linux系统配置优化
查看>>
encodeuricomponent VS encodeuri
查看>>
xxl-job之调度中心启动源码分析(一)
查看>>
微信公众号开发Django-JSSDK授权
查看>>
刘连响:小程序实时音视频在互动场景下的应用
查看>>
【跃迁之路】【517天】程序员高效学习方法论探索系列(实验阶段274-2018.07.07)...
查看>>
在Laravel 5.6中 使用Swoole的协程数据库查询
查看>>
按钮样式的正确方式
查看>>
iOS数据安全-编码和加密算法
查看>>
【晒出你的第83行代码】踌躇满志的三位高中生,以敬畏之心踏上了代码征程...
查看>>
js 2-函数
查看>>