brotli 压缩算法介绍

发布时间: 更新时间: 总字数:788 阅读时间:2m 作者: IP上海 分享 网址

Brotli 是一个通用的无损压缩算法,压缩的数据,结合使用一种现代变种LZ77算法,霍夫曼编码和第2次以上下文模型,用压缩比率相当于目前最好的可用的通用压缩的方法

介绍

  • 由 Google 开源于 2015 年
  • brotli 比 gzip 快 30%,压缩结果大小差不太多,阿里云 CDN 支持 brotli 压缩算法
  • Brotli Compressed Data Format is defined in RFC 7932
    • 2013-2016 年完成规范,旨在进一步提高压缩比,它在优化网站速度上有大量应用
    • Brotli 是相似的速度缩小,但提供了更多的密集的压缩
    • 与常见的通用压缩算法不同,Brotli 使用一个预定义的 120 千字节字典
    • 该字典包含超过 13000 个常用单词、短语和其他子字符串
    • 使用 brotli 取代 deflate 来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变
    • 使用 Brotli 进行流压缩的内容编码类型已被提议使用 br
  • Brotli 在 Web 浏览器中广泛用于压缩 Web 应用资源,如字体、javascript、图像等
    • 如今超过 95% 的网络浏览器都支持 Brotli 解压
    • 许多 Web 应用程序框架都支持 Brotli 编码(例如 NGINX 和 ASP.NET)
    • 一些 CDN 使用 Brotli 编码(例如 Aliyun、Azure 和 ImageKit)

安装

# ubuntu
sudo apt-get install -y brotli1g brotli1g-dev

# mac
brew install brotli

# centos/redhad
sudo yum install -y brotli brotli-devel

help

$ brotli --help
Usage: brotli [OPTION]... [FILE]...
Options:
  -#                          compression level (0-9)
  -c, --stdout                write on standard output
  -d, --decompress            decompress
  -f, --force                 force output file overwrite
  -h, --help                  display this help and exit
  -j, --rm                    remove source file(s)
  -k, --keep                  keep source file(s) (default)
  -n, --no-copy-stat          do not copy source file(s) attributes
  -o FILE, --output=FILE      output file (only if 1 input file)
  -q NUM, --quality=NUM       compression level (0-11)
  -t, --test                  test compressed file integrity
  -v, --verbose               verbose mode
  -w NUM, --lgwin=NUM         set LZ77 window size (0, 10-24)
                              window size = 2**NUM - 16
                              0 lets compressor choose the optimal value
  -S SUF, --suffix=SUF        output file suffix (default:'.br')
  -V, --version               display version and exit
  -Z, --best                  use best compression level (11) (default)
Simple options could be coalesced, i.e. '-9kf' is equivalent to '-9 -k -f'.
With no FILE, or when FILE is -, read standard input.
All arguments after '--' are treated as files.

Python lib

pip install brotli

pip install --upgrade git+https://github.com/google/brotli
  • 示例
import brotli
import os

input_file = '/etc/hosts'
output_file = 'hosts.br'

def compress_file(_input_file, _output_file):
    with open(_input_file, 'rb') as file:
        data = file.read()
        compressed_data = brotli.compress(data)
        with open(_output_file, 'wb') as _output_file:
            _output_file.write(compressed_data)


compress_file(input_file, output_file)

nginx

  • nginx.conf 的顶级块中添加指令
# Compress responses on-the-fly.
load_module modules/ngx_http_brotli_filter_module.so;
# Serve pre-compressed files.
# Both modules could be used separately
load_module modules/ngx_http_brotli_static_module.so;
  • 在配置文件中启用 brotli
brotli on;
brotli_comp_level 4;
brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;
brotli_static on;
  • 重启nginx
sudo systemctl restart nginx
  • 请求的header Accept-Encoding: br
  • 响应的header Content-Encoding: br

命令行使用

# 压缩
brotli --output=hosts.br /etc/hosts

# 解压
brotli -d hosts.br

扩展

  • Brotli-G 对标准 Brotli 比特流格式的修改
    • 允许使用 GPU 和多线程 CPU 进行高效的数据并行解压缩,同时仍保持相对较高压缩率

参考

  1. https://github.com/google/brotli
  2. https://zh.wikipedia.org/wiki/Brotli
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数