开发中,遇到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联系删除