django-cache

谈一谈 django 的缓存架构

动态网站的一个基本权衡就是他们是动态的,每次一个用户请求一个页面,web服务器进行各种各样的计算,

从数据库查询到模板渲染到业务逻辑 从生成站点到访问者看到的页面。从处理开销的角度来说,相比标准的从文件系统读取文件的服务器调度,这是昂贵了不少。但是对大多数网站来说,这种开销不是什么大的问题。因为大多数的网站都是小到中型的站点,流量特别少。但是对于中到大型的网站来说,必须尽可能的减少开销,这就是缓存的由来。


缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的:

  1. 给定一个url,检查页面是否在缓存中
  2. 如果在,返回缓存的页面
  3. 否则,生成该页面,把生成的页面保存在缓存中,返回生成的页面

django自带一个强大的缓存系统,提供不同层次的缓存粒度:你可以缓存某个视图函数的输出,或者只是某个特别难生成的部分或者是整个站点。 同时django也有类似“上流”缓存的东西,类似于Squid和基于浏览器的缓存,这类缓存是你无法直接控制但是你可以通过一些提示(比如http头 部)指定你网站的那些部分需要和如何缓存。

设置缓存

缓存系统需要少量的配置才能使用,你必须告诉系统你的缓存数据存放在哪里-数据库还是文件系统亦或是直接存在缓存中-这是一个重要的决定,直接影响到你的缓存性能;当然,一些缓存类型本来就是比其他的快,这我们无法回避。

在项目的配置文件里面可以通过CACHES配置缓存,下面我们一一讲解django中可用的缓存系统

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载从而显著提供网站性能,也是django中到目前为止最有效率的可用缓存。

Memcached作为一个后台进程运行,并分配一个指定的内存量,它所做的全是提供一个添加,检索和删除缓存中任意数据的快速接口,所有的数据都是直接存储在内存中,所以就没有了数据库或者文件系统使用的额外开销了。

在安装Memcached之后,你还需要安装一个绑定Memcached的东西,这里当做是插件之类的东西,最常用的两个是python-mencached和pylibmc。

在django中使用Memcached,你需要在配置文件里的CACHES做如下设置:

  • 根据你选择的插件,选择对应的后端(BACKEND)django.core.cache.backens.memcached.MemcachedCache或者django.core.cache.backends.memcached.PyLibMCCache
  • 给LOCATION设置ip:port值,其中ip是Memcached进程的IP地址,port是Memcached运行的端口,或者unix:path值,其中path是Memcached Unix socket文件所在的路径
1
2
3
4
5
6
7
8
9
10
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
'172.19.26.244:11213',
]
}
}