第
Golang使用gzip压缩字符减少redis等存储占用的实现
本文主要介绍了Golang使用gzip压缩字符减少redis等存储占用的实现,分享给大家,具体如下:
packagecompression
import(
???bytes
???compress/gzip
???encoding/json
funcGzipEncode(input[]byte)([]byte,error){
???//创建一个新的byte输出流
???varbufbytes.Buffer
???//创建一个新的gzip输出流
???//NoCompression???=flate.NoCompression???//不压缩
???//BestSpeed?????=flate.BestSpeed?????//最快速度
???//BestCompression??=flate.BestCompression??//最佳压缩比
???//DefaultCompression=flate.DefaultCompression//默认压缩比
???//gzip.NewWriterLevel()
???gzipWriter:=gzip.NewWriter(buf)
???//将inputbyte数组写入到此输出流中
???_,err:=gzipWriter.Write(input)
???iferr!=nil{
??????_=gzipWriter.Close()
??????returnnil,err
???}
???iferr:=gzipWriter.Close();err!=nil{
??????returnnil,err
???}
???//返回压缩后的bytes数组
???returnbuf.Bytes(),nil
funcGzipDecode(input[]byte)([]byte,error){
???//创建一个新的gzip.Reader
???bytesReader:=bytes.NewReader(input)
???gzipReader,err:=gzip.NewReader(bytesReader)
???iferr!=nil{
??????returnnil,err
???}
???deferfunc(){
??????//defer中关闭gzipReader
??????_=gzipReader.Close()
???}()
???buf:=new(bytes.Buffer)
???//从Reader中读取出数据
???if_,err:=buf.ReadFrom(gzipReader);err!=nil{
??????returnnil,err
???}
???returnbuf.Bytes(),nil
//压缩
funcMarshalJsonAndGzip(datainterface{})([]byte,error){
???marshalData,err:=json.Marshal(data)
???iferr!=nil{
??????returnnil,err
???}
???gzipData,err:=GzipEncode(marshalData)
???iferr!=nil{
??????returnnil,err
???}
???returngzipData,err
//解压
funcUnmarshalDataFromJsonWithGzip(input[]byte,outputinterface{})error{
???decodeData,err:=GzipDecode(input)
???iferr!=nil{
??????returnerr
???}
???err=json.Unmarshal(decodeData,output)
???iferr!=nil{
??????returnerr
???}
???returnnil
}