xiaoyi's blog
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

xuexuguang

后端新秀
首页
  • 后端文章

    • PHP
  • 学习笔记

    • 《Git》学习笔记
  • MySQL
  • NoSQL
  • 中间件
  • Linux
  • Nginx
  • 网络
  • Mac
  • 学习笔记

    • 《Nginx》学习笔记
  • 学习
  • 博客搭建
  • 技术文档
  • GitHub技巧
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 学习

  • GitHub技巧

  • 面试

    • 面试问题集锦
    • PHP基础
    • 正则表达式
    • PHP文件操作
    • PHP会话控制
    • 自定义函数及内置函数
    • MVC对比
    • linux
    • MySQL数据库基础
    • MySQL创建高性能的索引
    • MySQL的SQL优化
    • MySQL的高可扩展和高可用
    • MySQL安全
    • 常见算法
    • 常见数据结构
    • 高并发解决方案
    • 流量优化
    • 浏览器缓存和数据压缩
      • HTTP缓冲机制
        • 缓冲分类
        • 相关Header
        • 缓冲策略的选择
      • Nginx配置缓冲策略
        • 本地缓冲配置
        • 协商缓冲设置
      • 前端代码和资源的压缩
        • JavasScript代码的压缩
        • Css代码的压缩
        • Html代码压缩
        • 图片的压缩
    • 图片优化
    • 静态化处理
    • 动态语言并发处理
    • 数据库缓存优化
    • 负载均衡
  • 博客搭建

  • 心情杂货

  • 技术文档

  • 实用技巧

  • 友情链接
  • 更多
  • 面试
xuexuguang
2020-12-31

浏览器缓存和数据压缩

# HTTP缓冲机制

# 缓冲分类

缓冲分类 原理 优缺点
本地缓冲 200 from cache 直接从本地缓冲中获取响应,最快速最省流量,因为根本没有向服务器发送请求 本地读取,快速响应,不需要请求服务器
协商缓冲 304 Not Modified 浏览器在本地没有命中的情况下,请求头发送一定校验数据到服务端,如果服务端没有改变,浏览器从本地响应返回304 快速,数据量很小,只发送基本的响应头信息,不发送响应体
200 没有使用到缓冲,直接请求服务器 正常请求服务器

# 相关Header

Header 说明
Pragma 设置为no-cache表示禁用本地缓冲
Expires Http1.0时代用来启用本地缓冲的字段,expires值对应一个格林威治时间,告诉浏览器缓存失效的时刻,如果没到这个时刻,表示缓存有效
Cache-Control HTTP1.1 针对Expires时间不一致的解决方案运用cache-Control告知浏览器缓冲过期的时间间隔而不是时刻,即使具体时间不一致,也不影响缓冲的管理
Last-Modified 通知浏览器资源最后的修改时间,可以用在服务端进行header返回
HTTP_IF_MODIFIED_SINCE 客户端在请求时,自动携带Last-Modified头部信息
ETag 文件的指纹标识符,如果文件内容修改,指纹会改变
if-None-Match 本地缓冲失效,会携带此值去请求服务端,服务端判断该资源是否改变,如果没有改变,则直接使用本地缓冲,返回304

Cache-Control:HTTP1.1 针对Expires时间不一致的解决方案运用cache-Control告知浏览器缓冲过期的时间间隔而不是时刻,即使具体时间不一致,也不影响缓冲的管理

  1. no-store 禁止浏览器缓冲响应
  2. no-cache 不使用本地缓冲,先发起和服务器协商
  3. max-age = delta-seconds:告诉浏览器本地缓冲有效的最长期限,以秒为单位

以下是对header相关的使用,会根据header的有效期响应内容

$since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
$lifetime = 3600;

if(strtotime($since)+$lifetime > time()) {
    header('HTTP1.1 304 Not Modified');
    exit;
}

header('last-Modified:',gmdate('D,d M T H:i:s', time()),'GMT');
echo "contents";
1
2
3
4
5
6
7
8
9
10

# 缓冲策略的选择

适合缓冲的内容 eg:经常不改变的文件

  1. 不变的图像、如logo、图标等
  2. js、css静态文件
  3. 可下载的文件、媒体文件

适合协商缓冲 eg:经常改变的文件

  1. HTML文件
  2. 经常替换的图片
  3. 经常修改的js、css文件

不适合做缓冲

  1. 用户隐私等敏感数据
  2. 经常改变的api数据接口

# Nginx配置缓冲策略

参数 说明
add_header 添加状态码为2xx和3xx的响应头信息 add_header name value [always]
expires 通知浏览器过期时长

# 本地缓冲配置

location ~ .*\.(jpg|jpeg|gif|png|js|css)$
{
     // 缓冲30天 
     expires      30d;
     // 相当于cache-control设置为十年
     expires      max;
     add_header cache-control max-age=3600;
}

location ~ .*\.(js|css)$
{
     // 缓冲12h
     expires      12h;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 协商缓冲设置

location ~ .*\.(js|css)$
{
     // 缓冲12h
     etag     on;
}
1
2
3
4
5

# 前端代码和资源的压缩

让资源文件缩小,加快文件在网络中的传输,让网页更快的展示,降低网络带宽和流量消耗 ,通常压缩的内容包括:Js、Css、图片、Html代码的压缩

# JavasScript代码的压缩

去掉多余的空格和回车,替换长变量名,简化一些代码写法

常用压缩工具 : UglifyJS、YUICompressor、Closure、Compiler

# Css代码的压缩

去掉空白符等,跟压缩js代码差不多

常用压缩工具 : Css Compressor

# Html代码压缩

不建议使用代码压缩,有时会破坏代码结构,可以使用Gzip压缩 ,当然也可以使用htmlcompressor工具,不过转换后检查下代码结构

# 图片的压缩

压缩工具:tinypng、JpegMini、ImageOptim

编辑
#高并发面试题
上次更新: 2020/12/31, 06:55:18
流量优化
图片优化

← 流量优化 图片优化→

最近更新
01
MVC对比
12-31
02
负载均衡
12-31
03
数据库缓存优化
12-31
更多文章>
Theme by Vdoing | Copyright © 2020-2020 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式