欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Django】缓存

程序员文章站 2024-03-23 17:29:58
...

"***
由于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/
"