本文主要介绍了Golang使用gzip压缩字符减少redis等存储占用的实现,分享给大家,具体如下:
package compression
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 UnmarshalDataFromJsonWithGzip(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
}
到此这篇关于Golang使用gzip压缩字符减少redis等存储占用的实现的文章就介绍到这了,更多相关Golang gzip压缩减少存储占用内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!