Django笔记-Cache

邰勇军
2023-12-01

1.设定cache
cache可以设定为3中级别:数据库,文件,内存。
设定cache可以在setting.py中修改CACHE_BACKEND变量来修改。

2. 安装Memcached
毋庸置疑memory cache是最快的缓存了。安装相关步骤如下:
1)安装Memcached 网站:http://danga.com/memcached/
2)安装Memcached Python bindings,有两个版本可供选择
 a)cmemcache :http://gijsbert.org/cmemcache/ .
 b)python-memcache:http://www.danga.com/memcached/
3)配置CACHE_BACKEDND
配置Memcached的IP和端口。如下所示,Memcached支持多服务器互联。
如果设置多个IP,Memcached会将这些主机视为一个整体。
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'

Note:Memcached的缺点,因为时内存cache,所以服务器down时,会丢失。

3.Database Caching
1)创建cache数据库
python manage.py createcachetable [cache_table_name]
2)配置CACHE_BACKEND
CACHE_BACKEND = 'db://cache_table_name'

Note:数据库缓存后端使用settings文件指定的同一数据库,并且只能是相同的.即指定为sqlite则,缓存也是用它。

4.Filesystem  Caching
1)设置cache目录
以file://开头。例子:若linux设置为/var/tmp/django_cache目录
则指定:CACHE_BACKEND='file:///var/tmp/django_cache
若为windows,指定:c:/foo/bar目录
则指定为:file://c:/foo/bar

Note:指定的目录需要确保可读写。

5.Local-Memory Caching
如果没有条件安装Memcached,那么Local-Memory也是个不错的选择。
简单方便,只是该方法cache能力比较弱。设置方法:
CACHE_BACKEND = 'locmem:///'

6.Dummy Caching(For Development)
该设置是为了开发有cache的站点,但是在开发时不想cache来实现的。
设置方法:
CACHE_BACKEND = 'dummy:///'

7.CACHE_BACKEND参数设定
CACHE_BACKEND可以设定超时、最大cache数、达到最大数时的删除比率等参数。例子:

CACHE_BACKEND = 'memcached://127.0.0.1:1121/?timeout=30&max_entries=400&cull_percentage=2'
该值设定了超时30s,最大400个,当超时时删除1/2的内容。

8.The Per-Site Cache
最简单的方法就是整站cache了。只需要添加以下MiddleWare即可。
1)MIDDLEWARE_CLASSES = {
 'django.middleware.cache.UpdateCacheMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.cache.FetchFromCacheMiddleware’,
}
Note:按照常理,类的排序按照alphabetical比较好,这里必须把UpdateCacheMiddleware
排在最上面,可以参见http://www.djangobook.com/en/2.0/chapter15/#order-of-middleware-classes
2)添加cache设定
 a)CACHE_MIDDLEWARE_SECONDS-每个页面cache的时间单位/s
 b)CHAHE_MIDDLEWARE_KEY_PREFIX 如果缓存被多个使用相同Django安装的网站所共享,
 那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。如果你不在意的话可以设成空字符串。

Notes:
1)缓存中间件缓存每个没有GET或者POST参数的页面,即如果用户请求页面并在查询字符串里传递GET参数或者POST参数,
中间件将不会尝试得到缓存版本的页面,如果你打算使用整站缓存,设计你的程序时牢记这点,例如,
不要使用拥有查询字符串的URLs,除非那些页面可以不缓存
2)可以只对匿名用户缓存,设置CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

9.The Per-View Cache
1)定义Per-view cache
django.views.decorators.cache 中定义了一个cache_page装饰着,可以用来cache view。
例子:
from django.views.decorators.cache import cache_page

def my_view(request):
 #....
 
my_view = cache_page(my_view,60*15)

当然也可以用python的decorator语法:
@cache_page(60*15)
def my_view(request):
 #...
2)通过URL指定view cache
1)中的例子时通过硬编码实现的cache,这显然不是好的方法。如果向将views用在没有cache的
站点中,则不能复用。以下时推荐的方法:
from django.views.decorator.cache import cache_page

urlpatterns = patterns("",
 (r'^foo/(/d{1,2})/$,cache_page(my_view,60*15)),
)

10.Templage Fragment Caching
例子:
#footemplate.html
{% load cache %}
#.....
{% cache 500 sidebar %}
...sidebar...
{% endcache %}

11.The Low-Level Cache API
很多时候并不是想cache整个page,或者一些view也不适合整个cache。这时候就会用到
Django提供的低级的API接口。它可以cache所有的东东。例子:
from django.core.cache import cache
cache.set('my_key','hello,world!',30)#设定cache变量my_key,cache 30s,如果time不设置,则默认为setting中设置的值。
cache.get('my_key','has expired')#取出cache的my_key变量,如果过期,则返回has expired
cache.add('add_key', 'new value')#如果add_key过期,则设置新的为new value,否则不会添加

#设置多个接口例子:
cache.set('a',1)
cache.set('b',2)
cache.get_many(['a','b'])返回一个字典
{'a':1,'b':2}

11.更多cache
还有很多可用的cache相关资源。这里不再记述。
<END>

http://blog.csdn.net/sunyonggao/article/details/4791454
 类似资料: