07月02, 2016

Django中使用缓存

Django官方提供缓存处理方案,文档地址:Django’s cache framework,本文主要总结一下这些方案的使用方法 :

1、缓存来由及原理

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,Django提供了一个稳定的缓存系统让你缓存动态页面的结果,这样有相同的请求时就可以直接使用缓存中的数据,避免不必要的重复计算,另外Django还提供了不同粒度数据的缓存,你可以缓存整个视图页面,也可以缓存数据,甚至缓存整个网站

2、Django缓存的通用设置

Django设置缓存,需要在settings.py中添加以下设置:

CACHES = {
    'default': {
        'BACKEND': 'cache engine',
        'LOCATION': 'cache location',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000,
            'CULL_FREQUENCY': 3
        },
        'KEY_PREFIX': '',
        'VERSION': 1,
        'KEY_FUNCTION':'函数名'
    }
}

参数说明:

  • BACKEND:缓存引擎,接下来的内容会详细介绍
  • LOCATION:缓存地址,针对不同的缓存引擎会有不同的设置,接下来的内容会详细介绍
  • TIMEOUT:缓存超时时间,默认300,None表示永不过期,0表示立即过期(相当于关闭缓存)
  • MAX_ENTRIES:最大缓存个数,默认300
  • CULL_FREQUENCY:缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY,默认3
  • KEY_PREFIX:缓存key的前缀,默认空
  • VERSION:缓存key的版本,默认1
  • KEY_FUNCTION:生成key的函数,默认函数会生成为:【前缀:版本:key】 以上设置,在所有方式中都通用

3、不同方式的设置

I、Memcache缓存(python-memcached模块)

①、ip:port方式连接Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        # 通用配置参考第二节
    }
}

②、socket方式连接Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
        # 通用配置参考第二节
    }
}

③、同时使用多个Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '192.168.1.2:11211',
            'unix:/tmp/memcached.sock',
        ],
        # 通用配置参考第二节
    }
}

II、Memcache缓存(pylibmc模块)

①、ip:port方式连接Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
        # 通用配置参考第二节
    }
}

②、socket方式连接Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
        # 通用配置参考第二节
    }
}

③、同时使用多个Memcache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': [
            '192.168.1.2:11211',
            'unix:/tmp/memcached.sock',
        ],
        # 通用配置参考第二节
    }
}

III、数据库缓存

①、设置Cache:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        # 通用配置参考第二节
    }
}

参数说明:

  • LOCATION:my_cache_table,数据表名字,可以改为任意名字,只要不与该数据库中业务表冲突即可

②、创建Cache表:

进入Django项目目录,执行如下命令:

python manage.py createcachetable

IV、文件系统缓存

设置内容如下:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
        # Windows下设置如下
        # 'LOCATION': 'c:/foo/bar',
        # 通用配置参考第二节
    }
}

参数说明:

  • LOCATION:/var/tmp/django_cache,要放置缓存文件的文件夹路径

注意: 文件夹路径是绝对路径(从根目录开始),而且必须对该路径有读写权限

V、本地内存缓存

设置内容如下:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        # 通用配置参考第二节
    }
}

注意: 缓存LOCATION用来区分每个内存存储,如果你只有一个本地内存缓存,你可以忽略这个设置;但如果你有多个的时候,你需要至少给他们中一个赋予名字以区分他们。每个进程都有它们自己的私有缓存实例,所以跨进程缓存是不可能的,因此,本地内存缓存不是特别有效率的,建议只是在内部开发测时使用,不建议在生产环境中使用

VI、开发时调试模式的虚拟缓存

设置内容如下:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'LOCATION': 'location',
        # 通用配置参考第二节
    }
}

说明: 虚拟缓存,实际上没有缓存,只不过如果你设置了缓存时间,请求的时候一样会使用这个设置,但是服务器并没有缓存起来,这个在开发测试阶段不希望缓存,发布之后希望缓存的场景非常实用,到发布的时候,直接把dummy.DummyCache修改为真实使用的的缓存方式即可,无需再做其它修改

VII、站点缓存(全站缓存)

①、设置中间件:

'django.middleware.cache.UpdateCacheMiddleware',
# 其它中间件
'django.middleware.cache.FetchFromCacheMiddleware'

说明:

  • django.middleware.cache.UpdateCacheMiddleware必须设置在中间件第一位
  • django.middleware.cache.FetchFromCacheMiddleware必须设置在中间件最后一位

②、其它设置:

CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 0
CACHE_MIDDLEWARE_KEY_PREFIX ='key prefix'

说明:

  • CACHE_MIDDLEWARE_ALIAS:用来存储的缓存别名,默认default
  • CACHE_MIDDLEWARE_SECONDS:中间件页面的缓存时间,默认600
  • CACHE_MIDDLEWARE_KEY_PREFIX:关键的前缀,默认为'',与KEY_PREFIX合并使用,并不会替换KEY_PREFIX,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名

VIII、独立视图缓存

独立视图缓存是通过装饰器cache_page来实现的,使用方法主要分为两种
①、在views中使用cache_page:

from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
    ...

说明: 导入模块之后,在需要缓存的函数前加@cache_page(60 * 15) 60 * 15表示缓存时间是15分钟

示例:
views代码:

from django.views.decorators.cache import cache_page
@cache_page(10)
def cache(request):
    import time
    ctime = time.time()
    return  render(request,"cache.html",{"ctime":ctime})

templates代码:

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

</body>
</html>

这样一来前端页面在获取的ctime的时候就会被缓存10秒钟,10秒钟之后才会请求新的数据

②、在URLConf中使用cache_page:

from django.views.decorators.cache import cache_page
urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]

说明: 导入模块之后,在URLConf中需要缓存的view前加cache_page(60 * 15) ,这样一来,整个view都会被缓存

装饰器cache_page说明:

  • 即使没有设置缓存中间件,只要设置的缓存方式,也一样可以缓存
  • 只接受一个参数(timeout)和两个关键字参数(cache, key_prefix)

装饰器cache_page参数说明:

  • timeout:是缓存时间,以秒为单位
  • cache:指定使用你的CACHES设置中的哪一种缓存方式,不指定时,使用配置文件中CACHES的default设置
  • key_prefix:指定缓存前缀,可以覆盖配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的内容

独立视图缓存针对的是整体视图缓存,使用时有一定的局限性,所以就有了更为细腻的局部缓存

IX、局部缓存

局部缓存采用引入TemplateTag的方式实现,使用方法如下:

{% load cache %}
{% cache timeout cachekey %}
    .. cachekey ..
{% endcache %}

示例如下:

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ ctime }}</h1>
    <h1>{{ ctime }}</h1>
    {% cache 10 ctime %}
    <h1>{{ ctime }}</h1>
</body>
</html>
{% endcache %}

这样一来,只有最后使用的ctime被缓存了10秒,其它两个ctime引用时都是用的实时数据

以上就是根据Django官方文档总结出来的几种常见的Cache用法,有任何问题可以在文章下方留言。

本文链接:https://www.shaobin.wang/post/25.html

Comments