【Django】缓存

"***
由于Django是动态网站,所以每次请求都会去数据库中进行响应的操作。
当程序访问量大时,耗时必然会更加明显,最简单的解决方案就是使用缓存。

Django中的缓存:
即将某一个view的返回值保存至内存或memcache中,默认保存5分钟。在此时间内如果有人来访问此view,则不会去执行此view,而是直接从内存或memcache中获取此view的返回值,并返回.

Django中提供了6种缓存方式:

  1. 开发调试
  2. 内存
  3. 文件
  4. 数据库
  5. Memcache缓存(python-memcached模块)
  6. Memcache缓存(pylibmc模块)


配置


开发调试:

# 开发调试用,实际内部不做任何操作,即不会缓存
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 引擎,指定为开发调试
        'TIMEOUT': 300,  # 超时时间
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 缓存的最大个数(默认300)
            'CULL_FREQUENCY': 3,  # 缓存超过最大个数后,剔除缓存个数的比例, 即:1/CULL_FREQUENCY(默认3)
        },
        # 'KEY_PREFIX': '',  # 缓存key的前缀(默认空)
        # 'VERSION': 1,  # 缓存key的版本(默认1)
        # 'KEY_FUNCTION': "函数名",  # 生成key的函数(默认函数会生成为【前缀:版本:key】)
    },
}

缓存到内存:

# 此缓存将内容保存至内存的变量中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 引擎,指定为内存缓存
        'LOCATION': 'unique-snowflake',  # 唯一标识
        'TIMEOUT': 300,  # 超时时间
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 缓存的最大个数(默认300)
            'CULL_FREQUENCY': 3  # 缓存超过最大个数后,剔除缓存个数的比例, 即:1/CULL_FREQUENCY(默认3)
        }
    }
}

缓存到文件:

# 此缓存将内容保存至文件
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 引擎,指定为文件缓存
        'LOCATION': '/Users/macbook/django_cache',  # 缓存的文件夹路径(需要手动创建好文件夹)
    }
}
# 注:其他配置同开发调试版本

缓存到数据库:

# 此缓存将内容保存至数据库
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',  # 指定数据表
    }
}
# 将以上配置写好之后,执行命令:python manage.py createcachetable, 将会自动创建数据表

Memcache缓存(python-memcached模块):

# 此缓存使用python-memcached模块连接memcache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}

Memcache缓存(pylibmc模块):

# 此缓存使用pylibmc模块连接memcache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '/tmp/memcached.sock',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}


应用


全站使用:

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户。在返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将数据保存至缓存,从而实现全站缓存。

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放缓存(要写在中间件列表的头部)
	···
	# 其它中间件
	···
    'django.middleware.cache.FetchFromCacheMiddleware',  # 获取缓存(要写在中间件列表的尾部)
]

# 中间件缓存配置
# CACHE_MIDDLEWARE_SECONDS = 5  # 超时时间(指定int类型)
# CACHE_MIDDLEWARE_ALIAS = ''  # 别名
# CACHE_MIDDLEWARE_KEY_PREFIX = ''  # 关键的前缀

单独视图缓存:

# 方式一:
from django.views.decorators.cache import cache_page  # 用于缓存视图

@cache_page(5)  # 指定缓存时间为5秒(默认15*60)
def test(request):
	pass


# 方式二:
from django.views.decorators.cache import cache_page  # 用于缓存视图

urlpatterns = [
    url(r'^test/$', cache_page(5)(views.test)),
    # cache_page(5):指定缓存时间为5秒
    # (views.test):执行的视图函数
]

局部模版使用:

# 引入TemplateTag
{% load cache %}

# 使用缓存
{% cache 超时时间(s) 缓存key %}
	"""将要缓存的内容写在此处"""
{% endcache %}

关于Django缓存的更多知识:https://docs.djangoproject.com/en/1.11/topics/cache/
"

原文地址:https://www.cnblogs.com/zyk01/p/11376093.html