Django之缓存

简介:

一、什么是缓存

    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
相关文章
|
6月前
|
存储 缓存 API
Django缓存的使用方法
Django缓存的使用方法
|
8月前
|
缓存 中间件 数据库
django -- 缓存
django -- 缓存
|
5月前
|
缓存 NoSQL 数据库
31 Django高级 - 缓存
31 Django高级 - 缓存
28 0
|
缓存 NoSQL API
Django 缓存6.2
Django 缓存6.2
89 0
|
缓存 中间件 数据库
第25天,Django之缓存、序列化、信号
目录 一、缓存 1. 配置 1.1 开发调试 1.2 内存 1.3 文件 1.4 数据库 1.
979 0
|
缓存 数据库 Python
|
Web App开发 缓存 数据库
Django实现内容缓存
1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.
955 0
|
缓存 中间件 数据库
Django进阶之缓存和信号
一、缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
1196 0
|
1月前
|
缓存 NoSQL 安全
【Redis】缓存穿透
【Redis】缓存穿透
30 0