django缓存机制
如何提高网站的并发量:
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数
-使用cdn
-精灵图
-页面本地缓存
-nginx做负载均衡,后台服务做集群化的部署
-后台缓存(django中的缓存)
-数据库的主从同步
-读写分离
-异步处理(celery:分布式的异步任务框架)
缓存介绍
在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.
当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.
django的6种缓存机制
- 开发调试缓存
- 内存缓存
- 文件缓存
- 数据库缓存
- Memcache缓存(使用python-memcached模块)
- Memcache缓存(使用pylibmc模块)
经常使用的有文件缓存和Mencache缓存
缓存到文件中
-缓存位置的配置(在setting中配置,BACKEND不同,缓存的位置不同):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎
'LOCATION': 'F:\cache', # 指定缓存的路径
'TIMEOUT': 300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎 'LOCATION': 'F:\cache', #指定缓存的路径 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
缓存力度
-全站缓存
-单页面缓存
-局部缓存
缓存使用:
-1 配置setting文件,把cache配置进去
-2 单页面缓存:在视图函数上加一个装饰器
from django.views.decorators.cache import cache_page
@cache_page(5) 5 代表缓存时间
(ps:这个装饰器不能对CBV用)
@cache_page(5) def Test(request): str_time = time.time() return render(request, 'test.html', {'time': str_time})
-3 局部缓存
CBV,FBV都适用
views
def Test(request): str_time = time.time() return render(request, 'test.html', {'time': str_time})
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> </head> <body> {{ time }} {% load cache %} {% cache 5 'test'%}#第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取) <p>{{ time }}</p> {% endcache %} </body> </html>
-4 全站缓存
CBV,FBV都适用
-在setting中配置两个中间件:注意顺序
'django.middleware.cache.UpdateCacheMiddleware',
。。。。
'django.middleware.cache.FetchFromCacheMiddleware'
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 #缓存时间
-5 高级用法
-前后端分离项目
-设置值跟取值:
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