mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-03 20:40:25 +08:00
44 lines
929 B
Go
44 lines
929 B
Go
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cloud .
|
|
|
|
package shared
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/md5"
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
var dataMapPrefix = []byte("GOEDGE_DATA_MAP:")
|
|
|
|
// DataMap 二进制数据共享Map
|
|
// 用来减少相同数据占用的空间和内存
|
|
type DataMap struct {
|
|
Map map[string][]byte
|
|
locker sync.Mutex
|
|
}
|
|
|
|
// NewDataMap 构建对象
|
|
func NewDataMap() *DataMap {
|
|
return &DataMap{Map: map[string][]byte{}}
|
|
}
|
|
|
|
// Put 放入数据
|
|
func (this *DataMap) Put(data []byte) (keyData []byte) {
|
|
this.locker.Lock()
|
|
defer this.locker.Unlock()
|
|
var key = string(dataMapPrefix) + fmt.Sprintf("%x", md5.Sum(data))
|
|
this.Map[key] = data
|
|
return []byte(key)
|
|
}
|
|
|
|
// Read 读取数据
|
|
func (this *DataMap) Read(key []byte) []byte {
|
|
this.locker.Lock()
|
|
defer this.locker.Unlock()
|
|
if bytes.HasPrefix(key, dataMapPrefix) {
|
|
return this.Map[string(key)]
|
|
}
|
|
return key
|
|
}
|