本文共 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自己定义。