先来了解如下问题👇(面试会问)css
如何提升网站的并发量:
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒可以相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求而后服务器作出反应的过程。客户机在发送请时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数
使用cdn(静态文件放在别人的服务器,减小你的服务器的压力)
图片防盗链
-请求头里有refer,标志的从哪一个地方跳到我这里来的,计算引流(我这个网站给你这个网站作了膏,从我网站一点就跳到你网站去,它就会携带refer信息,人家一统计你这个网站是跳到我这个网站来的,说明你给我引了流量过来的,我须要给你付费)
-nginx处理
-精灵图:一个页面有十个小图就得发十个请求,它就将十个小图拼成一个图发一个请求,而后根据个人定位,给我定到一个地方,因此你看到的是就是显示的图
-页面本地缓存(请求次数减小)
-nginx作负载均衡,后台服务作集群化的部署
-后台缓存(django中的缓存)
-数据库的主从同步
-读写分离
-异步处理(celery:分布式的异步任务框架)
在动态网站中,用户全部的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.html
当一个网站的用户访问量很大的时候,每一次的的后台操做,都会消耗不少的服务端资源,因此必须使用缓存来减轻后端服务器的压力.python
缓存是将一些经常使用的数据保存内存或者memcache中,在必定的时间内有人来访问这些数据时,则再也不去执行数据库及渲染等操做,而是直接从内存或memcache的缓存中去取得数据,而后返回给用户.mysql
常常使用的有文件缓存和Mencache缓存jquery
1.2.3 文件缓存(把缓存数据存储在文件中)nginx
settings.py文件配置面试
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定缓存的路径 'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过时) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数以后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
1.2.4 数据库缓存(把缓存数据存储在数据库中)redis
settings.py文件配置sql
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎 'LOCATION': 'cache_table', # 数据库表 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数以后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
注意,建立缓存的数据库表使用的语句:数据库
python manage.py createcachetable
-缓存位置的配置(在setting中配置,BACKEND不一样,缓存的位置不一样):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎
'LOCATION': 'D:\lqz\cache', # 指定缓存的路径
'TIMEOUT': 300, # 缓存超时时间(默认为300秒,None表示永不过时)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数以后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
-缓存粒度
-全站缓存
-单页面缓存
-局部缓存
单页面缓存🎆
views.py
from django.shortcuts import render # Create your views here. from django.views.decorators.cache import cache_page import time @cache_page(5) def index(request): ctime = time.time() return render(request, 'index.html',{'time':ctime})
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script> <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script> </head> <body> {{ time }} </body> </html>
url.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',views.index) ]
-缓存使用:
-1 配置setting文件,把cache配置进去
-2 单页面缓存:在视图函数上加一个装饰器
from django.views.decorators.cache import cache_page
@cache_page(5) 5 表明缓存时间
局部缓存💥
from django.shortcuts import render # Create your views here. from django.views.decorators.cache import cache_page import time @cache_page(5) def index(request): ctime = time.time() return render(request, 'index.html',{'time':ctime})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script> <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script> </head> <body> {% load cache %} {% cache 5 'test' %} 当前时间{{ time }} {% endcache %} </body> </html>
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',views.index) ]
- 局部缓存
{% load cache %}
{% cache 5 'test'%} 第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,须要根据key值取)
当前时间:{{ time }}
{% endcache %}
全站缓存🎡
既然是全站缓存,固然要使用Django中的中间件.
用户的请求经过中间件,通过一系列的认证等操做,若是请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
当返回给用户以前,判断缓存中是否已经存在,若是不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
缓存整个站点,是最简单的缓存方法 在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件 MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 'django.middleware.common.CommonMiddleware', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 ) “update” 必须配置在第一个 “fetch” 必须配置在最后一个
修改settings.py配置文件
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', #响应HttpResponse中设置几个headers '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', #用来缓存经过GET和HEAD方法获取的状态码为200的响应 ) 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))
模板(index.html):
<!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>
其他代码不变,刷新浏览器是10秒,页面上的时间变化一次,这样就实现了全站缓存.
test是干啥用的:根据key值来取,一个页面有十个缓存,全叫test能够吗?这就全都乱套了,在局部缓存,没写这个key,那是根据什么来的,我这里没有存值,而缓存必定会有key对应的字符串 ,就是根据路由
- 高级用法
Create your views here. from rest_framework.views import APIView from app01.utils import MyRespone class Test(APIView): def get(self,request): response=MyRespone() response.data={'name':'lqz','age':18} response.code=100 response.msg='查询成功' return response.get_response()
from rest_framework.response import Response class MyRespone(): def __init__(self): self.code=100 self.msg=None def get_response(self): return Response(self.__dict__)
将以上的response.data取值方式改成如下
-先后端分离项目(保存数据,序列化以后的data)
-设置值跟取值:
cache.set('test_data',{'name':'lqz','age':18},5)
cache.get('test_data')
-浏览器的:同源策略,浏览器拒毫不是当前域域返回的数据
-ip地址和端口号都相同才是同一个域
-如何解决:
-CORS:跨域资源共享
-简单请求:发一次请求
-非简单请求:非简单请求是发送了两次请求,第一次是预检请求(OPTIONS请求),当预检经过,容许我发请求,再发送真实的请求
-解决跨域问题:(写好这个中间件配置一下)
class MyCorsMiddle(MiddlewareMixin):
def process_response(self, request, response):
if request.method == 'OPTIONS':
# 容许它
response['Access-Control-Allow-Headers'] = 'Content-Type'
# obj['Access-Control-Allow-Headers']='*'
# obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
response['Access-Control-Allow-Origin'] = '*'
return response
-别人写的cors-headers(了解一下)
-内存数据库 -Redis-x64-3.2.100---》mysql -redis-desktop-manager-0.9.3.817----》navcate-安装完后 -redis-server 服务端 -redis-cli 客户端