go-common/app/job/main/up/dao/account/account_cache.go
2019-04-22 18:49:16 +08:00

77 lines
1.3 KiB
Go

package account
import (
"context"
"sync"
"time"
account "go-common/app/service/main/account/model"
"go-common/library/log"
)
var (
infoCache = make(map[int64]*account.Info)
nextClearCacheTime time.Time
lock = sync.Mutex{}
)
const (
cacheClearInterval = 60 * time.Minute
)
//GetCachedInfos get cache info
func (d *Dao) GetCachedInfos(c context.Context, mids []int64, ip string) (infos map[int64]*account.Info, err error) {
d.checkClearCache()
var needFindMids []int64
infos = make(map[int64]*account.Info)
lock.Lock()
for _, v := range mids {
var info, ok = infoCache[v]
if !ok {
needFindMids = append(needFindMids, v)
continue
}
log.Info("hit cache! mid=%d", v)
infos[v] = info
}
lock.Unlock()
if len(needFindMids) == 0 {
return
}
var findinfo, e = d.Infos(c, needFindMids, ip)
err = e
if e != nil {
log.Error("try get uid info fail, err=%v", e)
return
}
lock.Lock()
for k, v := range findinfo {
infos[k] = v
infoCache[k] = v
}
lock.Unlock()
return
}
func (d *Dao) checkClearCache() {
var now = time.Now()
if now.Before(nextClearCacheTime) {
return
}
d.clearCache()
}
func (d *Dao) clearCache() {
nextClearCacheTime = time.Now().Add(cacheClearInterval)
if len(infoCache) == 0 {
return
}
lock.Lock()
infoCache = make(map[int64]*account.Info)
lock.Unlock()
}