Fetch the repository succeeded.
package cache
import (
"fmt"
"reflect"
"strings"
"sync"
"time"
"gitee.com/fast_api/api/def"
)
type ProcessCache interface {
EncodeKey(m *def.MethodInfo, args []reflect.Value) []byte
EncodeValue(s def.Serialize, v reflect.Value) []byte
}
type PersistenceCache interface {
Set(key []byte, value []byte, ttl time.Duration)
Get(key []byte) []byte
}
func SetPersistenceCacheImpl(persistenceCacheI PersistenceCache) {
persistenceCache = persistenceCacheI
}
func SetProcessCacheImpl(processCacheI ProcessCache) {
processCache = processCacheI
}
type defaultProcessCacheImpl struct{}
func (d *defaultProcessCacheImpl) EncodeKey(m *def.MethodInfo, args []reflect.Value) []byte {
var builder strings.Builder
for _, dm := range m.Param {
if !args[dm.Order].IsValid() {
continue
}
builder.WriteString(dm.Name)
builder.WriteString("=")
builder.WriteString(fmt.Sprintf("%s", args[dm.Order].Interface()))
builder.WriteString("@")
}
return []byte(builder.String())
}
func (d *defaultProcessCacheImpl) EncodeValue(s def.Serialize, v reflect.Value) []byte {
return s.Encode(v.Interface()).Bytes
}
type cEntry struct {
data []byte
t time.Time
}
type defaultPersistenceCache struct {
//cache map[string]cEntry
cache sync.Map
}
func (d *defaultPersistenceCache) Set(key []byte, value []byte, ttl time.Duration) {
d.cache.Store(string(key), cEntry{
data: value,
t: time.Now().Add(ttl),
})
}
func (d *defaultPersistenceCache) Get(key []byte) []byte {
if f, b := d.cache.Load(string(key)); b && f != nil {
entry := f.(cEntry)
if entry.t.After(time.Now()) {
return entry.data
}
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。