Golang使用gzip压缩字符减少redis等存储占用的实现

 更新时间:2023年01月31日 11:13:31   作者:少林码僧  
本文主要介绍了Golang使用gzip压缩字符减少redis等存储占用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文主要介绍了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压缩减少存储占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言为什么不支持前缀自增运算符原理解析

    Go语言为什么不支持前缀自增运算符原理解析

    这篇文章主要为大家介绍了Go语言为什么不支持前缀自增运算符原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 浅谈Go语言的error类型

    浅谈Go语言的error类型

    这篇文章主要介绍了浅谈Go语言的error类型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go 分布式链路追踪实现原理解析

    Go 分布式链路追踪实现原理解析

    分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施,本文将详细介绍分布式链路的核心概念、架构原理和相关开源标准协议,并分享我们在实现无侵入 Go 采集 Sdk 方面的一些实践,需要的朋友可以参考下
    2022-06-06
  • golang通过cgo调用C++库源码示例

    golang通过cgo调用C++库源码示例

    这篇文章主要给大家介绍了关于golang通过cgo调用C++库的相关资料,CGO是GO语言里面的一个特性,CGO属于GOLANG的高级用法,主要是通过使用GOLANG调用CLANG实现的程序库,需要的朋友可以参考下
    2024-02-02
  • Golang中map的三种声明定义方式实现

    Golang中map的三种声明定义方式实现

    本文主要介绍了Golang中map的三种声明定义方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 使用Go语言实现benchmark解析器

    使用Go语言实现benchmark解析器

    这篇文章主要为大家详细介绍了如何使用Go语言实现benchmark解析器并实现及Web UI 数据可视化,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2025-04-04
  • Go语言panic和recover的用法实例

    Go语言panic和recover的用法实例

    panic()和recover()是Go语言中用于处理错误的两个重要函数,本文主要介绍了Go语言panic和recover的用法实例,panic()用于中止程序并引发panic,而recover()用于捕获panic并恢复程序的执行,感兴趣的可以了解一下
    2024-01-01
  • Go定时器的三种实现方式示例详解

    Go定时器的三种实现方式示例详解

    这篇文章主要为大家介绍了Go定时器的三种实现方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang 中的json.Marshal问题总结(推荐)

    Golang 中的json.Marshal问题总结(推荐)

    这篇文章主要介绍了Golang中的json.Marshal问题总结,本文通过一个例子给大家详细讲解,本次提出的问题中,我们不难注意到其中的time.Time是一个匿名(Anonymous)字段,而这个就是答案的由来,需要的朋友可以参考下
    2022-06-06
  • Goland 生成可执行文件的操作

    Goland 生成可执行文件的操作

    这篇文章主要介绍了Goland 生成可执行文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论