【django 学习笔记】14-缓存机制

设定缓存

缓存设置在settings 文件 的 CACHE_BACKEND 中。 这里是一个CACHE_BACKEND 所 有可用值的解释。

内存缓冲

Memcached 是迄今为止可 用于Django 的最快, 最有效的缓存类型,Memcached 是完全基于内存的缓存框架, 在安装了Memcached 本身之后, 你将需要安装Memcached Python 绑定, 它没有直接和Django 绑定。 这两个可用版本。 选择和安装以下模块之一:

  • 最快的可用选项是一个模块, 称 为cmemcache,http://gijsbert.org/cmemcache
  • 如果您无法安装cmemcache, 您 可以安装python - Memcached,ftp://ftp.tummy.com/pub/python-memcached/ 。 如果该网址已不再有效, 只要到Memcached 的网 站http://www.danga.com/memcached/), 并 从客户端API 完成Python 绑定。

若要使用MemcachedDjango, 设置CACHE_BACKENDmemcached:/ / IP:port/, 其 中IPMemcached 的守护进程的IP 地址,portMemcached 运行的端口。

在这个例子中,Memcached 运 行在本地主机 (127.0.0.1), 端口为11211:

CACHE_BACKEND = ‘memcached://127.0.0.1:11211/’

Memcached 的一个极好的 特性是它在多个服务器间分享缓存的能力。这意味着您可以在多台机器上运行Memcached 的守护进程, 该程序会把这些机器当成一个单一缓存, 而无需重复每台机器上的缓存值。 要充分利用此功能, 请在CACHE_BACKEND 里引入所有服务器的地址, 用分号分隔。这个例子中, 缓存在运行在IP 地址为172.19.26.240172.19.26.242, 端口号为11211Memcached 实例间分享:

CACHE_BACKEND = ‘memcached://172.19.26.240:11211;172.19.26.242:11211/’

这个例子中, 缓存在运行在172.19.26.240( 端口11211),172.19.26.242( 端口11212),172.19.26.244 ( 端 口11213)Memcached 实例间分享:

CACHE_BACKEND = ‘memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/’

最后有关Memcached 的一 点是, 基于内存的缓存有一个重大的缺 点。 由于缓存的数据存储在内存中, 所 以如果您的服务器崩溃, 数据将会消失。 显然, 内存不是用来持久化数据的, 因此不要把基于内存的缓存作为您唯一的存储数据 缓存。 毫无疑问,Django 的缓存后端不应该用于持久化, 它们本来就被设计成缓存的解决方案。但我们仍然 指出此点, 这里是因为基于内存的缓存是 暂时的。

数据库缓存为了使用数据库表作为缓存后端, 首 先在数据库中运行这个命令以创建缓存表:

python manage.py createcachetable [cache_table_name]

这里的[cache_table_name] 是 要创建的数据库表名。 ( 这个名字随你 的便, 只要它是一个有效的表名, 而且不是已经在您的数据库中使用的表名。) 这个命令以Django 的数据库缓存系统所期望的格式创建一个 表。一旦你创建了数据库表, 把你的CACHE_BACKEND 设置为”db://tablename”, 这里的tablename 是数据库表的名字, 在这个例子中, 缓存表名为my_cache_table: 在这个例子中, 高速缓存表的名字是my_cache_table:

CACHE_BACKEND = ‘db://my_cache_table’

数据库缓存后端使用你的settings 文 件指定的同一数据库。你不能为你的缓存表使用不同的数据库后端. 如果你已经有了一个快速, 良好的索引数据库服务器, 那么数据库缓存的效果最明显。

文件系统缓存

要把缓存项目放在文件系统上, 请 为CACHE_BACKEND 使用”file://“ 的缓存类型。例如, 要把缓存数据存储在/var/tmp/django_cache, 请使用此设置:

CACHE_BACKEND = ‘file:///var/tmp/django_cache’

如果你的服务器以用户apache 运 行, 确认/var/tmp/django_cache 存在并 且用户apache 可以读写/var/tmp/django_cache 目 录。

本地内存缓存

如果你想利用内存缓存的速度优势, 但 又不能使用Memcached, 可以考 虑使用本地存储器缓存后端。 此缓存的多进程和线程安全。 设置 CACHE_BACKEND locmem:/// 来使用它, 例如:

CACHE_BACKEND = ‘locmem:///’

仿缓存( 供开发时使用)

假如你有一个产品站点, 在许多地 方使用高度缓存, 但在开发/ 测试环境中, 你不想缓存, 也不想改变代码, 这就非常有用了。 要激活虚拟缓存, 就像这样设置CACHE_BACKEND:

CACHE_BACKEND = ‘dummy:///’

使用自定义缓存后端

要让Django 使用

外部缓存后端, 需要使用一个Python import 路径作为的CACHE_BACKEND URI( 第一个冒号前的部分), 像这样:

CACHE_BACKEND = ‘path.to.backend://’

CACHE_BACKEND 参 数

站点级 Cache

一旦高速缓存设置, 最简单的方法 是使用缓存缓存整个网站。您需要添加’django.middleware.cache.UpdateCacheMiddleware’ 和‘django.middleware.cache.FetchFromCacheMiddleware’ 到 您的MIDDLEWARE_CLASSES 设 置中, 在这个例子中是:

MIDDLEWARE_CLASSES = (

‘django.middleware.cache.UpdateCacheMiddleware’,

‘django.middleware.common.CommonMiddleware’,

‘django.middleware.cache.FetchFromCacheMiddleware’,

)

视图级缓存

更加颗粒级的缓存框架使用方法是对单个视图的输出进行缓存。 django.views.decorators.cache 定义了一个自动缓存视图响应的cache_page 装饰器。 他是很容易使用的:

from django.views.decorators.cache import cache_page

def my_view(request):

# …

my_view = cache_page(my_view, 60 * 15)

URLconf 中 指定视图缓存

以下是同一个 URLconf , 不 过用 cache_page 包裹了 my_view :

from django.views.decorators.cache import cache_page

urlpatterns = (”,

(r’^foo/(/d{1,2})/$’, cache_page(my_view, 60 * 15)),

)

如果采取这种方法, 不要忘记在 URLconf 中导入 cache_page

模板碎片缓存

你同样可以使用cache 标签来 缓存模板片段。 在模板的顶端附近加入{% load cache %} 以通知模板存取缓存标签。模板标签{% cache %} 在给定的时间内缓存了块的内容。 它至少需要两个参数: 缓存超时时间( 以秒计) 和指定缓存片段的名称。 示例:

{% load cache %}

{% cache 500 sidebar %}

.. sidebar ..

{% endcache %}

有时你可能想缓存基于片段的动态内容的多份拷贝。 比如, 你想为上一个例子的每个用户分别缓存侧边栏。这样只需要给{% cache %} 传递额外的参数以标识缓存片 段。

{% load cache %}

{% cache 500 sidebar request.user.username %}

.. sidebar for logged in user ..

{% endcache %}

低层次缓存API

比如说, 也许你的站点所包含的一 个视图依赖几个费时的查询, 每隔一段时 间结果就会发生变化。 在这种情况下, 使 用站点级缓存或者视图级缓存策略所提供的整页缓存并不是最理想的, 因为你可能不会想对整个结果进行缓存( 因为一些数据经常变化), 但你仍然会想对很少变化的部分进行缓存。

针对这样的情况,Django 提 供了简单低级的缓存API 。 你可以通过这个API, 以任何你需要的 粒度来缓存对象。 你可以对所有能够安全进行 pickle 处理的 Python 对 象进行缓存: 字符串、字典和模型对象 列表等等。 ( 查阅 Python 文档可以了解到更多关于 pickling 的信息。)

上游缓存

但还有一种与 Web 开发相关 的缓存: 上游缓存。 有一些系统甚至在请求到达站点之前就为用户进行页面缓存。

上游缓存将会产生非常明显的效率提升, 但 也存在一定风险。 许多网页的内容依据身份验证以及许多其他变量的情况发生变化, 缓存系统仅盲目地根据 URL 保存页面, 可能会向这些页面的后续访问者暴露不正确或者敏感的数据。

举个例子, 假定你在使用网页电邮 系统, 显然收件箱页面的内容取决于登录 的是哪个用户。 如果 ISP 盲目地 缓存了该站点, 那么第一个用户通过该 ISP 登录之后,( 或她) 的用户收件箱页面将会缓存给后续的访问者。 这一点也不好玩。

使用 Vary 头部

控制缓存: 使用其它 头部

其他优化

MIDDLEWARE_CLASSES 的顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值