Перейти к содержимому

Сжатие данных

Сжатие и распаковка данных с использованием алгоритмов gzip, deflate, zlib, brotli и zstd.

local compress = require("compress")

Наиболее широко поддерживаемый формат (RFC 1952).

-- Сжатие для HTTP-ответа
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Установка заголовка Content-Encoding
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Максимальное сжатие для хранения
local archived = compress.gzip.encode(data, {level = 9})
-- Быстрое сжатие для реального времени
local fast = compress.gzip.encode(data, {level = 1})
ПараметрТипОписание
datastringДанные для сжатия
optionstable?Опции кодирования (опционально)
ПолеТипОписание
levelintegerУровень сжатия 1-9 (по умолчанию: 6)

Возвращает: string, error

-- Распаковка HTTP-запроса
local content_encoding = req:header("Content-Encoding")
if content_encoding == "gzip" then
local body = req:body()
local decompressed, err = compress.gzip.decode(body)
if err then
return nil, errors.new("INVALID", "Invalid gzip data")
end
body = decompressed
end
-- Распаковка с ограничением размера (защита от zip-бомб)
local decompressed, err = compress.gzip.decode(data, {max_size = 10 * 1024 * 1024})
if err then
return nil, errors.new("INVALID", "Decompressed size exceeds 10MB limit")
end
ПараметрТипОписание
datastringСжатые GZIP-данные
optionstable?Опции декодирования (опционально)
ПолеТипОписание
max_sizeintegerМакс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB)

Возвращает: string, error

Лучшая степень сжатия для текста (RFC 7932).

-- Лучше всего подходит для статических ресурсов и текста
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Кэширование сжатых ресурсов
cache:set("static:" .. hash, compressed)
-- Умеренное сжатие для API-ответов
local compressed = compress.brotli.encode(json_data, {level = 4})
ПараметрТипОписание
datastringДанные для сжатия
optionstable?Опции кодирования (опционально)
ПолеТипОписание
levelintegerУровень сжатия 0-11 (по умолчанию: 6)

Возвращает: string, error

local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- С ограничением размера
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
ПараметрТипОписание
datastringСжатые Brotli-данные
optionstable?Опции декодирования (опционально)
ПолеТипОписание
max_sizeintegerМакс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB)

Возвращает: string, error

Быстрое сжатие с хорошим соотношением (RFC 8878).

-- Хороший баланс скорости и степени сжатия
local compressed = compress.zstd.encode(binary_data)
-- Высокое сжатие для архивов
local archived = compress.zstd.encode(data, {level = 19})
-- Быстрый режим для потоковой передачи
local fast = compress.zstd.encode(data, {level = 1})
ПараметрТипОписание
datastringДанные для сжатия
optionstable?Опции кодирования (опционально)
ПолеТипОписание
levelintegerУровень сжатия 1-22 (по умолчанию: 3)
dictstring?Байты Zstd-словаря из train_dict (по умолчанию: нет)

Возвращает: string, error

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
ПараметрТипОписание
datastringСжатые Zstandard-данные
optionstable?Опции декодирования (опционально)
ПолеТипОписание
max_sizeintegerМакс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB)
dictstring?Байты Zstd-словаря (должны совпадать со словарём, использованным для кодирования)

Возвращает: string, error

Обучите словарь на образцах данных, чтобы улучшить сжатие множества небольших похожих нагрузок. Передавайте обученный словарь как опцию dict в encode/decode — для обоих должен использоваться один и тот же словарь.

local dict, err = compress.zstd.train_dict(samples, { size = 112640 })
local packed = compress.zstd.encode(data, { dict = dict })
local original = compress.zstd.decode(packed, { dict = dict })
ПараметрТипОписание
samplesstring[]Обучающие образцы (хотя бы один >= 8 байт)
optionstable?size (integer, целевой размер словаря в байтах, 256-1048576, по умолчанию 114688), id (integer, по умолчанию 0), level (integer, 1-22)

Возвращает: string, error (байты словаря)

ПараметрТипОписание
dictstringБайты словаря

Возвращает: table, error{id: integer, content_size: integer}

Чистое DEFLATE-сжатие (RFC 1951). Используется внутри других форматов.

local compressed = compress.deflate.encode(data, {level = 6})
ПараметрТипОписание
datastringДанные для сжатия
optionstable?Опции кодирования (опционально)
ПолеТипОписание
levelintegerУровень сжатия 1-9 (по умолчанию: 6)

Возвращает: string, error

local decompressed = compress.deflate.decode(compressed)
ПараметрТипОписание
datastringСжатые DEFLATE-данные
optionstable?Опции декодирования (опционально)
ПолеТипОписание
max_sizeintegerМакс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB)

Возвращает: string, error

DEFLATE с заголовком и контрольной суммой (RFC 1950).

local compressed = compress.zlib.encode(data, {level = 6})
ПараметрТипОписание
datastringДанные для сжатия
optionstable?Опции кодирования (опционально)
ПолеТипОписание
levelintegerУровень сжатия 1-9 (по умолчанию: 6)

Возвращает: string, error

local decompressed = compress.zlib.decode(compressed)
ПараметрТипОписание
datastringСжатые Zlib-данные
optionstable?Опции декодирования (опционально)
ПолеТипОписание
max_sizeintegerМакс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB)

Возвращает: string, error

АлгоритмПрименениеСкоростьСтепеньДиапазон уровней
gzipHTTP, широкая совместимостьСредняяХорошая1-9
brotliСтатические ресурсы, текстНизкаяЛучшая0-11
zstdБольшие файлы, потокиВысокаяХорошая1-22
deflate/zlibНизкоуровневые протоколыСредняяХорошая1-9
-- HTTP-ответ на основе Accept-Encoding
local accept = req:header("Accept-Encoding") or ""
local body = json.encode(response_data)
if accept:find("br") then
res:set_header("Content-Encoding", "br")
res:write(compress.brotli.encode(body))
elseif accept:find("gzip") then
res:set_header("Content-Encoding", "gzip")
res:write(compress.gzip.encode(body))
else
res:write(body)
end
УсловиеKindПовторяемо
Пустой вводerrors.INVALIDнет
Уровень вне диапазонаerrors.INVALIDнет
Некорректные сжатые данныеerrors.INVALIDнет
Распакованный размер превышает лимитerrors.INTERNALнет

См. Обработка ошибок для работы с ошибками.