Django的缓存
动态网站的不足之处体现在“动态”上。每请求一个页面,Web 服务器都要做各种计算,为了让用户可以看到页面,要查询数据库、渲染模板,还要执行一些业务逻辑。从消耗方面来看,这个过程比从文件系统中读取一个文件要耗资源。
Django 提供了一个强健的缓存系统,能把动态页面保存起来,不用每次请求都重新生成。为了便于使用,Django 提供的缓存分为不同的粒度层次,可以缓存特定视图的输出、可以只缓存不易生成的片段,也可以缓存整个网站。
配置缓存
开发调试
Django提供了一个虚拟的缓存,它并不是真正的缓存,只是实现了缓存接口。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
基于本地内存的缓存
如果你的本地主机内存够大够快,也可以直接使用它作为缓存。配置如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
文件缓存
基于文件的后端会序列化各个缓存值,将其存入单独的文件
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': 'c:/foo/bar',
}
}
数据库缓存
Django 可以把缓存数据存入数据库。如果数据库服务器的索引稳定快速,这样做效果最好。以数据表为缓存后端的步骤如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
但是在某些情况下,还是有一些用途的,比如你有一个高速、高效索引的数据库。
注意,创建缓存的数据库表使用的语句:
python manage.py createcachetable
Memcached
Memcached是Django原生支持的缓存系统,速度快,效率高。Memcached是一种基于内存的缓存服务,起初是为了解决LiveJournal.com的负载问题而开发的,后来由Danga开源。 它被类似Facebook和维基百科这种大型网站使用,用来减少数据库访问次数,显著地提高了网站的性能。
Memcached会启动一个守护进程,并分配单独的内存块。其主要工作就是为缓存提供一个快速的添加,检索,删除的接口。所有的数据直接存储在内存中,所以它不能取代数据库或者文件系统的功能。如果你对缓存很熟悉,这些内容都很好理解。
需要注意的是:
- Memcached不是Django自带的软件,而是一个独立的软件,需要你自己安装、配置和启动服务;
- Memcached安装好了后,还要安装Python操作Memcached的依赖库,最常用的是python-memcached和pylibmc;
- 上面两个条件都满足了后,还要在Django中进行配置。
配置方法:
-
根据你安装的Python依赖库不同,将CACHES的BACKEND设置为
django.core.cache.backends.memcached.MemcachedCache 或者 django.core.cache.backends.memcached.PyLibMCCache
-
设置LOCATION为你的Memecached守护进程所在的主机IP和进程端口,格式为ip:port的字符串。或者unix:path的形式,在Unix操作系统中。
下面是一个参考例子,Memcached运行在localhost (127.0.0.1) port 11211
,使用了python-memcached
库:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
下面的Memcached运行在本地的Unix socket上:/tmp/memcached.sock
,依赖python-memcached
: