django 之 缓存

缓存是将一个某个views的返回值保存至内存或者memcache中,在一定时间内再次访问时,则不再去执行view中的操作,而是直接从缓存中取并返回。

缓存中保存的数据格式为 key:value 形式

 

缓存方式,

Django 默认提供了5种

1、开发调试 -- 实际内部不做任何操作

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎

        ### 以下为不同方式的通用配置 ###
        'TIMEOUT': 300,    # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,      # 最大缓存个数(默认300)
            'CULL_FREQUENCY': 3,     # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        },
        # 缓存key的设置(可默认不写) 
        'KEY_PREFIX': '',     # 缓存key的前缀(默认空)
        'VERSION': 1,         # 缓存key的版本(默认1)
        'KEY_FUNCTION': 'default_key_func' # 生成缓存信息的函数如下(默认函数会生成为:【前缀:版本:key】,可自定义)                 
    }
}

def default_key_func(key, key_prefix, version):
    """
    Default function to generate keys.

    Constructs the key used by all other methods. By default it prepends
    the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
    function with custom key making behavior.
    """
    return '%s:%s:%s' % (key_prefix, version, key)

2、内存 -- 将缓存内容保存至内存的变量中

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',   # 在内存中会创建一个全局变量(字典),key必须唯一
    }
}

3、文件  -- 将缓存内容保存至文件

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
    }
}

4、数据库 --  将缓存内容保存至数据库

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table', # 定义保存缓存的数据库表
    }
}

5、Memcache  --  将缓存内容保存至缓存服务器

5.1  使用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', # 本地socket方式连接
    }
}   

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]  # 集群
    }
}
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            ('172.19.26.240:11211',1),
            ('172.19.26.242:11211',10),
        ]  # 集群(设置权重)
    }
}

5.2  使用pylibmc模块连接memcache

配置格式和python-memcached模块一样,替换引擎即可  'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache'

Python 操作Memcache 参考: http://www.cnblogs.com/wupeiqi/articles/5132791.html

 

控制缓存的内容(细粒度)

1、单独视图缓存 -- 缓存视图中的某个函数返回的全部内容

示例:

=== settings.py === 

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

=== view.py === 

import time
from django.views.decorators.cache import cache_page  
@cache_page(10)  # 10秒缓存失效(优先级比setting.py中的失效时间高),通过给cache函数加上装饰器,当请求来时,如果缓存有数据则直接返回,不再执行函数
def cache(request):
    ctime = time.time()
    return render(request, 'cache.html', {'ctime': ctime})

=== cache.html ===

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

2、局部视图缓存 -- 缓存视图函数返回的局部内容

示例:

=== view.py === 

import time
def cache(request):
    ctime = time.time()
    return render(request, 'cache.html', {'ctime': ctime})

=== cache.html ===

{% load cache %}  <!-- 引入cache模板标签 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{ ctime }}</h1>
     {% cache 10 k1 %}  <!-- 10秒过期,k1为缓存的key -->
        <h1>{{ ctime }}</h1>  <!-- 对该部分内容进行缓存 -->
     {% endcache %}
</body>
</html>

3、全站缓存(较少应用)

通过中间件,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    # 其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',
]

 

posted @ 2018-01-27 11:51  bobo0609  Views(257)  Comments(0)    收藏  举报