- 推荐学习文档
本文主要介绍了Golang使用gzip压缩字符减少redis等存储占用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
废话不多说,直接上代码:
package main
import (
"bytes"
"compress/gzip"
"encoding/json"
)
func GzipEncode(input []byte) ([]byte, error) {
// 创建一个新的 byte 输出流
var buf bytes.Buffer
// 创建一个新的 gzip 输出流
//NoCompression = flate.NoCompression // 不压缩
//BestSpeed = flate.BestSpeed // 最快速度
//BestCompression = flate.BestCompression // 最佳压缩比
//DefaultCompression = flate.DefaultCompression // 默认压缩比
//gzip.NewWriterLevel()
gzipWriter := gzip.NewWriter(&buf)
// 将 input byte 数组写入到此输出流中
_, err := gzipWriter.Write(input)
if err != nil {
_ = gzipWriter.Close()
return nil, err
}
if err := gzipWriter.Close(); err != nil {
return nil, err
}
// 返回压缩后的 bytes 数组
return buf.Bytes(), nil
}
func GzipDecode(input []byte) ([]byte, error) {
// 创建一个新的 gzip.Reader
bytesReader := bytes.NewReader(input)
gzipReader, err := gzip.NewReader(bytesReader)
if err != nil {
return nil, err
}
defer func() {
// defer 中关闭 gzipReader
_ = gzipReader.Close()
}()
buf := new(bytes.Buffer)
// 从 Reader 中读取出数据
if _, err := buf.ReadFrom(gzipReader); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
// 压缩
func MarshalJsonAndGzip(data interface{}) ([]byte, error) {
marshalData, err := json.Marshal(data)
if err != nil {
return nil, err
}
gzipData, err := GzipEncode(marshalData)
if err != nil {
return nil, err
}
return gzipData, err
}
// 解压
func DecodeDataFromJsonByGzip(input []byte, output interface{}) error {
decodeData, err := GzipDecode(input)
if err != nil {
return err
}
err = json.Unmarshal(decodeData, output)
if err != nil {
return err
}
return nil
}
flate包用于数据的压缩和解压缩。其中NoCompression、BestSpeed、BestCompression和DefaultCompression是该包中用于指定压缩级别或策略的常量。
- NoCompression
- 不进行任何压缩操作,直接返回原始数据。
- 适用于对压缩时间要求极高且数据本身已经相对较小或者不需要压缩的情况。
- BestSpeed
- 以最快的压缩速度进行压缩,但是压缩率可能相对较低。
- 适合对时间敏感而对压缩比要求不高的场景,例如实时数据传输或需要快速处理大量数据但对存储空间要求不那么严格的时候。
- BestCompression
- 追求最高的压缩比,会花费更多的时间进行压缩操作。
- 适用于对存储空间要求严格,且可以容忍较长压缩时间的情况,比如长期存储数据或通过网络传输大文件时希望尽量减少传输量。
- DefaultCompression
- 采用默认的压缩级别,在压缩速度和压缩比之间进行平衡。
- 通常是一种比较通用的选择,适用于大多数一般的场景,既不会花费过多时间进行压缩,也能获得一定程度的压缩效果。
关注我看更多有意思的文章哦!👉👉