网站优化的一些方法

字节鎏金师
• 阅读 1451

写在前面

年初Django开发的网站项目第一版已经上线,因为需求变动太大,所以想按照前后端分离的方式早点推重构再优化,但是时间又不允许,所以就先做第一版的优化,重构的事并行,以后考虑迁移数据。

关于静态文件

  1. 压缩js/css文件。
    我们使用gulp来压缩js/css文件。

  2. 静态文件全部迁移到七牛云存储里面。
    原来的静态文件直接放在服务器里,首页图片比较多,之前测试服务器加载完首页js/css/图片,最长的一个文件时间需要3.6秒左右,现在最长的图片只需要170ms左右。在七牛对象存储bucket中可以设置文件的浏览器缓存Cache-Control的max-age的秒数,这样可以让静态文件在客户端浏览器中缓存,比如static/js/index.js,第一次请求资源时会请求服务器,如果没有超出缓存时间,下载请求时直接加载本地资源。不过这里可能会产生一个问题。如果你的静态文件缓存在本地浏览器或者七牛的CDN中,你在更新服务器代码的时候,就会产生脏数据。用户请求的数据依旧是之前的缓存在本地或者CDN中的数据。解决的方法有几种,第一种是在你的静态文件后面加参数,比如原来请求static/js/index.js现在改成static/js/index.js?v=20170809,这两个是不同的URI,会促使服务器重新加载新的静态文件,但是这样做有个问题,只能全量更新,无法增量更新。第二种方式是在你的静态文件前面加前缀,比如/v1/static/js/index.js,这个缺点也是一样,无法增量更新。第三种方式是在文件名后加md5值,比如static/js/index.c6d9c9fc12c1dbaee77703a4dd731a8b.js。如果没有改过的文件,还是会加载到缓存中,该过的文件,由于md5值变了,会请求新的文件,所以推荐使用第三种方式。由于我们项目的历史原因,没办法改成第三种,暂时只能通过缓存的设置,我把客户端缓存设置为8小时,七牛的静态文件缓存为1个月,然后通过七牛的refresh的API,批量刷新一下网站中自己写的js/css的文件夹目录,让七牛的缓存从源中重新拉取文件。这样在半夜更新服务器时,让用户在第二天使用时不会加载脏数据。

关于Media

  1. 视频
    视频一般就直接上传七牛,CDN加速。

  2. 图片
    图片最早我们是直接用python的wand库切图后,保存到线上服务器中。后来发现切图的时间慢,而且很消耗CPU跟内存的资源,所以现在都是原图直接上传到七牛中,七牛针对图片有图片样式的处理,比如头像,我们有三种标准4040,5050,8080,原来只切成8080的图片,不管哪种样式,通过css的width跟height属性控制其他样式。现在直接定义三个样式,在图片请求加上相关参数,直接就获取了这三个样式的图片,最小化的减少图片的加载。

关于Cache

1.把常访问的页面用cache静态化。
2.把常用的数据全部丢到在redis中,减少从数据库中请求。

数据库

  1. 数据库读写分离。提高数据库性能。

  2. 代码中减少对数据库查询的请求,一次查完的不要查二次,对经常查询的字段建索引。

下一阶段要做的优化

  1. 负载均衡。

  2. 分库分表。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
爱丽丝13 爱丽丝13
4年前
聊聊前端性能优化
为什么要做性能优化?性能优化有多重要?网站的性能对于用户的留存率、转化率有很大的影响,直白的说,提高网站的性能可以直接提高网站带来的收益。性能优化的分类前端的性能优化主要分为两类:1.加载时优化;2.运行时优化;例如压缩文件、使用CDN加载静态资源属于加载时优化;及时的解绑事件、减少DOM的操作属于运行时优化。吉
巴拉米 巴拉米
4年前
前端性能优化
为什么要做性能优化?性能优化有多重要?网站的性能对于用户的留存率、转化率有很大的影响,直白的说,提高网站的性能可以直接提高网站带来的收益。性能优化的分类前端的性能优化主要分为两类:1.加载时优化;2.运行时优化;例如压缩文件、使用CDN加载静态资源属于加载时优化;及时的解绑事件、减少DOM的操作属于运行时优化。吉
Karen110 Karen110
4年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Linux下配置Django_Apache_Mysql环境(CentOS 7.5)
本文将介绍如何在Linux上部署DjangoMysqlApache环境。我们知道,Django内置的http服务器只能工作在单线程下,做开发和调试时候是可以的,但是生产环境通常都会有多用户并发,而且django的simpleHTTPserver处理大量静态文件的性能太差,所以要用apache做前端。Django自带的SQLite数据库权限
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable