优化
#
数据库优化#
数据库查询优化#
only和defer#
select_related与prefetch_related#
Mysql达到1亿多条数据,怎么处理mysql在常规配置下,一般只能承受2000万的数据量(同时读写,且表中有大文本字段,单台服务器),其实当数据量达到500万-800万的时候就应该考虑做优化。现在超过1亿,并不断增加的情况下,建议如下处理:
- 分表,可以按时间,或按一定的规则拆分,比如分类,做到查询某一条数据,尽量在一个子表中。比如分表可以采用按时间分,根据实际情况一个月或一个季度的分
- 分库,分库最基本的就是读写分离,不行就多加机器做负载,尤其是写入,放在新表中,定期进行同步,如果其中记录不断有update,最好将写的数据放在redis中,定期同步
- 表的大文本字段分离出来,成为独立的新表。存储大文本字段,可以使用NOSQL数据库
- 优化架构或优化SQL查询,避免联表查询,尽量不要用count(*), in,递归等消耗性能的语句
- 使用缓存,重复读取时,直接从缓存中读取
上面是低成本的管理方法,基本几台服务器即可搞定,但是管理起来麻烦一些。
#
DRF缓存有些数据是经常被用户查询使用的,而且数据基本不变化,所以我们可以将这些数据进行缓存处理,减少数据库的查询次数。
在Django REST framework中使用缓存,可以通过drf-extensions
扩展来实现。
关于扩展使用缓存的文档,可参考链接http://chibisov.github.io/drf-extensions/docs/#caching
#
安装#
使用方法1) 直接添加装饰器
可以在使用rest_framework_extensions.cache.decorators中的cache_response装饰器来装饰返回数据的类视图的对象方法,如
cache_response装饰器可以接收两个参数
- timeout 缓存时间
- cache 缓存使用的Django缓存后端(即CACHES配置中的键名称)
如果在使用cache_response装饰器时未指明timeout或者cache参数,则会使用配置文件中的默认配置,可以通过如下方法指明:
- DEFAULT_CACHE_RESPONSE_TIMEOUT 缓存有效期,单位秒
- DEFAULT_USE_CACHE 缓存的存储方式,与配置文件中的
CACHES
的键对应。
注意,cache_response装饰器既可以装饰在类视图中的get方法上,也可以装饰在REST framework扩展类提供的list或retrieve方法上。使用cache_response装饰器无需使用method_decorator进行转换。
2)使用drf-extensions提供的扩展类
drf-extensions扩展对于缓存提供了三个扩展类:
ListCacheResponseMixin
用于缓存返回列表数据的视图,与ListModelMixin扩展类配合使用,实际是为list方法添加了cache_response装饰器
RetrieveCacheResponseMixin
用于缓存返回单一数据的视图,与RetrieveModelMixin扩展类配合使用,实际是为retrieve方法添加了cache_response装饰器
CacheResponseMixin
为视图集同时补充List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin一起配合使用。
三个扩展类都是在rest_framework_extensions.cache.mixins
中。
#
页面静态化页面静态化即将动态渲染生成的页面结果保存成html文件,放到静态文件服务器中。用户访问的时候访问的直接是处理好之后的html静态文件。
对于页面中属于每个用户展示不同数据内容的部分,可以在用户请求完静态化之后的页面后,在页面中向后端发送请求,获取属于用户的特殊的数据。
#
django页面静态化流程准备需要静态化的页面的
模板
文件 放到templates里配置一个保存
静态化后
的html文件的路径编写逻辑函数
查询数据库 把查询出来的数据构造成字典
加载模板文件(会去templates文件夹里面找)
利用模板语法渲染到模板中
把渲染好的html文本写入到html文件
上线后把html文件放在静态服务器
在页面中既会用到Django的模板语法,也会用到前端Vue的模板语法,可以通过在前端中修改Vue的模板变量语法来避免冲突
对于首页的静态化,考虑到页面的数据可能由多名运营人员维护,并且经常变动,所以将其做成定时任务,即定时执行静态化。
在Django执行定时任务,可以通过django-crontab
扩展来实现。
注意了哦 底层用的是Linux的crontab 所以windows是用不了的 可以用celery的定时任务做
安装
添加应用
基本格式 :
首页的定时任务设置如下
在定时任务中,如果出现非英文字符,会出现字符异常错误
可以通过在配置文件中添加定时任务执行的附加命令来实现
#
开启定时任务添加定时任务到系统中
显示已经激活的定时任务
移除定时任务