Golang开发:xorm+gzip实现mysql中字符串压缩存取。

Golang开发:xorm+gzip实现mysql中字符串压缩存取。

开发中,遇到mysql大的字符串存储需求,也不用于查询,只是存储一下

可以使用压缩算法来降低存储的使用,也能加速数据存取,毕竟mysql得存取成本还是挺高的

基于简单的方案:xorm+gzip压缩

xorm提供特定的接口Conversion,可以对实现该接口的数据类型存取时自动进行转换,还是挺方便的

type Conversion interface {
    FromDB([]byte) error
    ToDB() ([]byte, error)
}

因为数据存取的都是byte,所以在mysql中的数据类型需要对应的设置为blob类型。

实现

import (
	\"bytes\"
	\"compress/gzip\"
	\"encoding/json\"
	\"io\"
)

type ZipAlerts []*Alert

// FromDB implement xorm db interface
func (za *ZipAlerts) FromDB(bs []byte) error {
	if bs == nil {
		return nil
	}
	zr, err := gzip.NewReader(bytes.NewBuffer(bs))
	if err != nil {
		return err
	}
	var buf bytes.Buffer
	_, err = io.Copy(&buf, zr)
	if err != nil {
		return err
	}
	var znf ZipAlerts
	err = json.Unmarshal(buf.Bytes(), &znf)
	if err != nil {
		return err
	}
	*za = znf
	return nil
}

// ToDB implement xorm db interface
func (za *ZipAlerts) ToDB() ([]byte, error) {
	if za == nil {
		return nil, nil
	}
	data, err := json.Marshal(za)
	if err != nil {
		return nil, err
	}
	var buf bytes.Buffer
	zw := gzip.NewWriter(&buf)
	_, err = zw.Write(data)
	if err != nil {
		return nil, err
	}
	zw.Close()
	return buf.Bytes(), nil
}

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/114290.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
网络营销专员网络营销专员订阅用户
上一篇 2022年10月26日
下一篇 2022年10月26日

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息