介绍
缓存是将一些常用的数据保存在内存或者memcache中,在设置好的时间内,如果有请求访问这些数据,则不会再去操作数据库、执行逻辑、渲染等操作,而是直接从内存或者memcache的缓存中取取出数据,返回给用户
在动态网站中,用户向服务端发起请求,服务器都会去数据库中进行相应的增删改查 —> 执行逻辑 —> 渲染模板 —> 返回响应 —> 最后生成用户所看到的页面
出现的问题:
- 当用户访问量很庞大时,每一次都去操作一遍数据库,会消耗非常多的服务器资源
解决方案:
缓存方式
- 开发调试缓存
- 内存缓存
- 文件缓存
- 数据库缓存
- Memcache缓存(使用python-memcached模块/使用pylibmc模块)
常用:文件缓存、Memcache缓存
缓存配置
开发调试(此模式为开发调试使用,实际上不执行任何操作)
1 2 3 4 5 6 7 8 9 10 11 12
|
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', 'TIMEOUT': 300, 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, }, } }
|
内存缓存(将缓存内容保存至内存区域中)
1 2 3 4 5 6 7 8 9 10 11 12 13
|
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', 'TIMEOUT':300, 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, } } }
|
文件缓存(把缓存数据存储在文件中)
1 2 3 4 5 6 7 8 9 10 11 12 13
|
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', 'TIMEOUT':300, 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, } } }
|
数据库缓存(把缓存数据存储在数据库中)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'cache_table', 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, } } }
''' 注意: python manage.py createcachetable (创建缓存的数据库表使用的语句)
'''
|
Memcache缓存(使用python-memcached模块连接memcache)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '192.168.10.100:11211', 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, } } }
'LOCATION': 'unix:/tmp/memcached.sock', 'LOCATION': [ '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
|
Memcache缓存(使用pylibmc模块连接memcache)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION':'192.168.10.100:11211', 'OPTIONS':{ 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, }, } }
'LOCATION': '/tmp/memcached.sock', 'LOCATION': [ '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ] ''' 注意: Memcache是基于内存的缓存,数据存储在内存中,所以如果服务器宕机的话,数据就会丢失,所以Memcache一般与其他缓存配合使用 '''
|
缓存应用
Django提供了不同力度的缓存,可以只缓存一个页面的某个部分,也可以缓存整个页面,甚至可以缓存整个网站
视图函数使用缓存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
from django.views.decorators.cache import cache_page import time from .models import *
@cache_page(15) def index(request): t=time.time() bookList=Book.objects.all() return render(request,"index.html",locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>当前时间:-----{{ t }}</h3>
<ul> {% for book in bookList %} <li>{{ book.name }}--------->{{ book.price }}$</li> {% endfor %} </ul>
</body> </html>
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': 'E:\django_cache', 'TIMEOUT': 300, 'OPTIONS': { 'MAX_ENTRIES': 300, 'CULL_FREQUENCY': 3, } } }
|
全站使用缓存
用户的请求通过中间件,经过一系列的认证的操作
如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
如果请求的内容在缓存中不存在,则使用UpdateCacheMiddleware将缓存保存至Django的缓存中,并返回,实现全站缓存
缓存整个站点,是最简单的缓存方式(用的少)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', )
''' “update” 必须配置在第一个 “fetch” 必须配置在最后一个 '''
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware',
)
CACHE_MIDDLEWARE_SECONDS=10
from django.views.decorators.cache import cache_page import time from .models import *
def index(request):
t=time.time() bookList=Book.objects.all() return render(request,"index.html",locals())
def foo(request): t=time.time() return HttpResponse("HELLO:"+str(t))
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3 style="color: green">当前时间:-----{{ t }}</h3>
<ul> {% for book in bookList %} <li>{{ book.name }}--------->{{ book.price }}$</li> {% endfor %} </ul>
</body> </html>
|
局部视图缓存
刷新页面时,网页的一部分实现缓存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
from django.views.decorators.cache import cache_page import time from .models import * def index(request): t=time.time() bookList=Book.objects.all() return render(request,"index.html",locals())
{% load cache %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3 style="color: green">不缓存:-----{{ t }}</h3>
{% cache 2 'name' %} <h3>缓存:-----:{{ t }}</h3> {% endcache %}
</body> </html>
|