|
|
|
// Copyright 2022 ROC. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package cache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/allegro/bigcache/v3"
|
|
|
|
"github.com/rocboss/paopao-ce/internal/conf"
|
|
|
|
"github.com/rocboss/paopao-ce/internal/core"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
_onceInit sync.Once
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewRedisCache() core.RedisCache {
|
|
|
|
return &redisCache{
|
|
|
|
c: conf.MustRedisClient(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewBigCacheIndexService(ips core.IndexPostsService, ams core.AuthorizationManageService) (core.CacheIndexService, core.VersionInfo) {
|
|
|
|
s := conf.BigCacheIndexSetting
|
|
|
|
c := bigcache.DefaultConfig(s.ExpireInSecond)
|
|
|
|
c.Shards = s.MaxIndexPage
|
|
|
|
c.HardMaxCacheSize = s.HardMaxCacheSize
|
|
|
|
c.Verbose = s.Verbose
|
|
|
|
c.MaxEntrySize = 10000
|
|
|
|
c.Logger = logrus.StandardLogger()
|
|
|
|
|
|
|
|
bc, err := bigcache.New(context.Background(), c)
|
|
|
|
if err != nil {
|
|
|
|
logrus.Fatalf("initial bigCahceIndex failure by err: %v", err)
|
|
|
|
}
|
|
|
|
cacheIndex := newCacheIndexSrv(ips, ams, &bigCacheTweetsCache{
|
|
|
|
bc: bc,
|
|
|
|
})
|
|
|
|
return cacheIndex, cacheIndex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewRedisCacheIndexService(ips core.IndexPostsService, ams core.AuthorizationManageService) (core.CacheIndexService, core.VersionInfo) {
|
|
|
|
cacheIndex := newCacheIndexSrv(ips, ams, &redisCacheTweetsCache{
|
|
|
|
expireDuration: conf.RedisCacheIndexSetting.ExpireInSecond,
|
|
|
|
expireInSecond: int64(conf.RedisCacheIndexSetting.ExpireInSecond / time.Second),
|
|
|
|
c: conf.MustRedisClient(),
|
|
|
|
})
|
|
|
|
return cacheIndex, cacheIndex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewWebCache() core.WebCache {
|
|
|
|
lazyInitial()
|
|
|
|
return _webCache
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSimpleCacheIndexService(indexPosts core.IndexPostsService) (core.CacheIndexService, core.VersionInfo) {
|
|
|
|
s := conf.SimpleCacheIndexSetting
|
|
|
|
cacheIndex := &simpleCacheIndexServant{
|
|
|
|
ips: indexPosts,
|
|
|
|
maxIndexSize: s.MaxIndexSize,
|
|
|
|
indexPosts: nil,
|
|
|
|
checkTick: time.NewTicker(s.CheckTickDuration), // check whether need update index every 1 minute
|
|
|
|
expireIndexTick: time.NewTicker(time.Second),
|
|
|
|
}
|
|
|
|
|
|
|
|
// force expire index every ExpireTickDuration second
|
|
|
|
if s.ExpireTickDuration != 0 {
|
|
|
|
cacheIndex.expireIndexTick.Reset(s.CheckTickDuration)
|
|
|
|
} else {
|
|
|
|
cacheIndex.expireIndexTick.Stop()
|
|
|
|
}
|
|
|
|
|
|
|
|
// indexActionCh capacity custom configure by conf.yaml need in [10, 10000]
|
|
|
|
// or re-compile source to adjust min/max capacity
|
|
|
|
capacity := conf.CacheIndexSetting.MaxUpdateQPS
|
|
|
|
if capacity < 10 {
|
|
|
|
capacity = 10
|
|
|
|
} else if capacity > 10000 {
|
|
|
|
capacity = 10000
|
|
|
|
}
|
|
|
|
cacheIndex.indexActionCh = make(chan core.IdxAct, capacity)
|
|
|
|
|
|
|
|
// start index posts
|
|
|
|
cacheIndex.atomicIndex.Store(cacheIndex.indexPosts)
|
|
|
|
go cacheIndex.startIndexPosts()
|
|
|
|
|
|
|
|
return cacheIndex, cacheIndex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewNoneCacheIndexService(indexPosts core.IndexPostsService) (core.CacheIndexService, core.VersionInfo) {
|
|
|
|
obj := &noneCacheIndexServant{
|
|
|
|
ips: indexPosts,
|
|
|
|
}
|
|
|
|
return obj, obj
|
|
|
|
}
|
|
|
|
|
|
|
|
func lazyInitial() {
|
|
|
|
_onceInit.Do(func() {
|
|
|
|
_webCache = newWebCache()
|
|
|
|
})
|
|
|
|
}
|