Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn)
更新時間:2023年01月31日 11:13:31 作者:少林碼僧
本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
本文主要介紹了Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn),分享給大家,具體如下:
package compression
import (
?? ?"bytes"
?? ?"compress/gzip"
?? ?"encoding/json"
)
func GzipEncode(input []byte) ([]byte, error) {
?? ?// 創(chuàng)建一個新的 byte 輸出流
?? ?var buf bytes.Buffer
?? ?// 創(chuàng)建一個新的 gzip 輸出流
?? ?//NoCompression ? ? ?= flate.NoCompression ? ? ?// 不壓縮
?? ?//BestSpeed ? ? ? ? ?= flate.BestSpeed ? ? ? ? ?// 最快速度
?? ?//BestCompression ? ?= flate.BestCompression ? ?// 最佳壓縮比
?? ?//DefaultCompression = flate.DefaultCompression // 默認(rèn)壓縮比
?? ?//gzip.NewWriterLevel()
?? ?gzipWriter := gzip.NewWriter(&buf)
?? ?// 將 input byte 數(shù)組寫入到此輸出流中
?? ?_, err := gzipWriter.Write(input)
?? ?if err != nil {
?? ??? ?_ = gzipWriter.Close()
?? ??? ?return nil, err
?? ?}
?? ?if err := gzipWriter.Close(); err != nil {
?? ??? ?return nil, err
?? ?}
?? ?// 返回壓縮后的 bytes 數(shù)組
?? ?return buf.Bytes(), nil
}
func GzipDecode(input []byte) ([]byte, error) {
?? ?// 創(chuàng)建一個新的 gzip.Reader
?? ?bytesReader := bytes.NewReader(input)
?? ?gzipReader, err := gzip.NewReader(bytesReader)
?? ?if err != nil {
?? ??? ?return nil, err
?? ?}
?? ?defer func() {
?? ??? ?// defer 中關(guān)閉 gzipReader
?? ??? ?_ = gzipReader.Close()
?? ?}()
?? ?buf := new(bytes.Buffer)
?? ?// 從 Reader 中讀取出數(shù)據(jù)
?? ?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
}到此這篇關(guān)于Golang使用gzip壓縮字符減少redis等存儲占用的實現(xiàn)的文章就介紹到這了,更多相關(guān)Golang gzip壓縮減少存儲占用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang?中的json.Marshal問題總結(jié)(推薦)
這篇文章主要介紹了Golang中的json.Marshal問題總結(jié),本文通過一個例子給大家詳細(xì)講解,本次提出的問題中,我們不難注意到其中的time.Time是一個匿名(Anonymous)字段,而這個就是答案的由來,需要的朋友可以參考下2022-06-06

