一、什么是缓存

    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、开发调试(实际内部不做任何动作)

CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
            }
        }

b、本地内存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

c、本地文件

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR, "cache"),
    }
}

d、数据库

缓存连哪个数据库,就看你在配置文件中DATABASES定义了使用哪个数据库!

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',  # 数据库表名
    }
}

命令行中运行:python3 manage.py createcachetable命令创建数据库表

e、Memchache(python-memcached模块)

# 使用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模块)

# 使用方法同上面一模一样,只需把引擎换成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])

# 示例

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、全站使用(对所有的视图函数生效)

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放在第一个
    # 其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后一个
    ]

    用户请求过来时,先跳过UpdateCacheMiddleware中间件,执行其他中间件,最后到FetchFromCacheMiddleware中间件时。如果缓存内容已存在,则直接返回给用户;如果缓存内容不存在则获取并返回数据。当返回给用户之前,往回执行到UpdateCacheMiddleware中间件,判断内容是否已经缓存,如果不存在则缓存。

b、单独视图缓存

views.py

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ time_now }}
</body>
</html>

c、视图局部缓存

views.py

import time

def cache2(req):
    time_now = time.time()
    return render(req, "cache2.html", locals())

cache2.html

{% 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自己定义。