07.Django-缓存
缓存
缓存是将一些常用的数据保存到内存或者memcache中。在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
一、如何提高网站并发量?
- cdn加速:把静态资源放到别人服务器
- 精灵图
- 后台数据库用mysql+redis
- sql的优化:索引,分库分表,读写分离
- 用缓存
- 程序架构:集群化的部署,分布式+异步 celery:分布式异步任务
二、缓存方式
1. 开发调式缓存
开发调试缓存为开发调试使用,实际上不执行任何操作
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.dummy.DummyCache‘, # 缓存后台使用的引擎 ‘TIMEOUT‘: 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期) ‘OPTIONS‘:{ ‘MAX_ENTRIES‘: 300, # 最大缓存记录的数量(默认300) # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) ‘CULL_FREQUENCY‘: 3, } } }
2. 内存缓存
将缓存内容保存至内存区域中
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘, # 指定缓存使用的引擎 ‘LOCATION‘: ‘unique-snowflake‘, # 写在内存中的变量的唯一值 ‘TIMEOUT‘:300, # 缓存超时时间(默认为300秒,None表示永不过期) ‘OPTIONS‘:{ ‘MAX_ENTRIES‘: 300, # 最大缓存记录的数量(默认300) # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) ‘CULL_FREQUENCY‘: 3, } } }
3. 文件缓存
Django会以自己的形式把缓存文件保存在配置文件中指定的目录中
CACHES = { ‘default‘: { ‘BACKEND‘:‘django.core.cache.backends.filebased.FileBasedCache‘, #指定缓存使用的引擎 ‘LOCATION‘: ‘/var/tmp/django_cache‘, #指定缓存的路径 ‘TIMEOUT‘:300, #缓存超时时间(默认为300秒,None表示永不过期) ‘OPTIONS‘:{ ‘MAX_ENTRIES‘: 300, # 最大缓存记录的数量(默认300) # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) ‘CULL_FREQUENCY‘: 3, } } }
4. 数据库缓存
把缓存数据存储在数据库中
CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘, # 指定缓存使用的引擎 ‘LOCATION‘: ‘cache_table‘, # 数据库表 ‘OPTIONS‘:{ ‘MAX_ENTRIES‘: 300, # 最大缓存记录的数量(默认300) # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) ‘CULL_FREQUENCY‘: 3, } } }
5. Memcache缓存
5.1 使用python-memcached模块
缓存到Memcache数据库
# 此缓存使用python-memcached模块连接memcache CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘127.0.0.1:11211‘, #通过网络socket连接,缓存到单台服务的 memcache数据库 } } CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: ‘unix:/tmp/memcached.sock‘, #通过本地文件socket,缓存本机memcache数据库 } } #通过网络socket连接,缓存到memcache 集群 CACHES = { #其中 6和89为 ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘, ‘LOCATION‘: [ (‘172.19.26.240:11211‘,6), (‘172.19.26.242:11211‘,89), ] } }
5.2 使用pylibmc模块
还可以使用其他Python模块连接到Memcache,老铁你是否联想到了 redis?默认还不支持!需要借助第三方插件;
# 此缓存使用pylibmc模块连接memcache CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.PyLibMCCache‘, ‘LOCATION‘: ‘127.0.0.1:11211‘, } } CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.PyLibMCCache‘, ‘LOCATION‘: ‘/tmp/memcached.sock‘, } } CACHES = { ‘default‘: { ‘BACKEND‘: ‘django.core.cache.backends.memcached.PyLibMCCache‘, ‘LOCATION‘: [ ‘172.19.26.240:11211‘, ‘172.19.26.242:11211‘, ] } }
三、缓存应用
1. 单独视图缓存
因为缓存的原因,不停的刷新浏览器时会发现,页面上显示的时间每15秒钟变化一次;
立即在数据库中添加一个用户对象,刷新浏览器,网页上不会立即显示刚才添加的用户;
一直刷新浏览器15秒后,新添加的用户才会在前端页面上显示出来。
添加路由记录
url(r"^index$",views.index)
定义视图函数
from app01 import models from django.views.decorators.cache import cache_page #导入设置缓存的装饰器 import time @cache_page(15) #超时时间为15秒 def index(request): user_list = models.UserInfo.objects.all() ctime = time.time() return render(request,"index.html",{"user_list":user_list,"ctime":ctime})
定义HTML页面
<body> <h1>{{ ctime }}</h1> <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul> </body>
2. 局部视图缓存
刷新页面时,整个网页有一部分页面实现缓存即为局部视图缓存
添加路由记录
url(r"^index$",views.index)
定义视图函数
from django.shortcuts import render import time def index(request): ctime = time.time() return render(request,"index.html",{"ctime":ctime})
定义HTML页面
{% load cache %} <!DOCTYPE html> <html lang="en"> <head> <meat charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ ctime }}</h1> {% cache 15 ‘aaa‘ %} <h1>{{ ctime }}</h1> {% endcache %} </body> </html>
刷新浏览器可以看到,第一个时间实时变化,后面一个时间15秒钟变化一次
3. 全站使用缓存
用户的请求到达中间件,并经过中间件的认证
如果请求的内容在缓存中,则使用FetchFromCacheMiddleware获取内容并返回给用户
请求的内容不存在缓存,去操作数据库取得数据,经过渲染生成字符串返回给用户
当返回给用户之前,判断缓存中是否已经存在该数据,如果不存在,则UpdateCacheMiddleware会基于取得的数据生成Django的缓存
添加路由记录
url(r"^index$",views.index)
配置文件
from django.middleware.cache import UpdateCacheMiddleware from django.middleware.cache import FetchFromCacheMiddleware MIDDLEWARE_CLASSES = [ ‘django.middleware.cache.UpdateCacheMiddleware‘, ‘django.middleware.security.SecurityMiddleware‘, ‘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.cache.FetchFromCacheMiddleware‘, ] CACHE_MIDDLEWARE_SECONDS=15
定义视图函数
from django.shortcuts import render import time def index(request): ctime = time.time() return render(request,"index.html",{"ctime":ctime})
定义HTML网页
<body> <h1>{{ ctime }}</h1> <ul> {% for user in user_list %} <li>{{ user.name }}</li> </ul> </body>
刷新浏览器时15秒,页面上的时间变化一次,这样就实现了全站缓存