wp-go/internal/pkg/cache/cache.go

125 lines
4.0 KiB
Go
Raw Normal View History

2023-01-12 12:42:16 +00:00
package cache
import (
"context"
"github.com/fthvgb1/wp-go/cache"
"github.com/fthvgb1/wp-go/internal/pkg/config"
"github.com/fthvgb1/wp-go/internal/pkg/dao"
"github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models"
2023-01-12 12:42:16 +00:00
"sync"
"time"
)
2023-01-14 04:21:31 +00:00
var postContextCache *cache.MapCache[uint64, common.PostContext]
2023-01-12 12:42:16 +00:00
var archivesCaches *Arch
2023-01-17 15:18:31 +00:00
var categoryCaches *cache.SliceCache[models.TermsMy]
var recentPostsCaches *cache.SliceCache[models.Posts]
var recentCommentsCaches *cache.SliceCache[models.Comments]
2023-01-12 12:42:16 +00:00
var postCommentCaches *cache.MapCache[uint64, []uint64]
2023-01-17 15:18:31 +00:00
var postsCache *cache.MapCache[uint64, models.Posts]
2023-01-12 12:42:16 +00:00
var postMetaCache *cache.MapCache[uint64, map[string]any]
var monthPostsCache *cache.MapCache[string, []uint64]
2023-01-14 04:21:31 +00:00
var postListIdsCache *cache.MapCache[string, common.PostIds]
var searchPostIdsCache *cache.MapCache[string, common.PostIds]
2023-01-12 12:42:16 +00:00
var maxPostIdCache *cache.SliceCache[uint64]
2023-01-17 15:18:31 +00:00
var usersCache *cache.MapCache[uint64, models.Users]
var usersNameCache *cache.MapCache[string, models.Users]
var commentsCache *cache.MapCache[uint64, models.Comments]
2023-01-12 12:42:16 +00:00
func InitActionsCommonCache() {
c := config.Conf.Load()
archivesCaches = &Arch{
mutex: &sync.Mutex{},
2023-01-14 04:21:31 +00:00
setCacheFunc: common.Archives,
2023-01-12 12:42:16 +00:00
}
2023-01-14 04:21:31 +00:00
searchPostIdsCache = cache.NewMapCacheByFn[string, common.PostIds](common.SearchPostIds, c.SearchPostCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
postListIdsCache = cache.NewMapCacheByFn[string, common.PostIds](common.SearchPostIds, c.PostListCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
monthPostsCache = cache.NewMapCacheByFn[string, []uint64](common.MonthPost, c.MonthPostCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
postContextCache = cache.NewMapCacheByFn[uint64, common.PostContext](common.GetPostContext, c.ContextPostCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
postsCache = cache.NewMapCacheByBatchFn[uint64, models.Posts](common.GetPostsByIds, c.PostDataCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
postMetaCache = cache.NewMapCacheByBatchFn[uint64, map[string]any](common.GetPostMetaByPostIds, c.PostDataCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
categoryCaches = cache.NewSliceCache[models.TermsMy](common.Categories, c.CategoryCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
recentPostsCaches = cache.NewSliceCache[models.Posts](common.RecentPosts, c.RecentPostCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
recentCommentsCaches = cache.NewSliceCache[models.Comments](common.RecentComments, c.RecentCommentsCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
postCommentCaches = cache.NewMapCacheByFn[uint64, []uint64](common.PostComments, c.PostCommentsCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-14 04:21:31 +00:00
maxPostIdCache = cache.NewSliceCache[uint64](common.GetMaxPostId, c.MaxPostIdCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
usersCache = cache.NewMapCacheByFn[uint64, models.Users](common.GetUserById, c.UserInfoCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
usersNameCache = cache.NewMapCacheByFn[string, models.Users](common.GetUserByName, c.UserInfoCacheTime)
2023-01-12 12:42:16 +00:00
2023-01-17 15:18:31 +00:00
commentsCache = cache.NewMapCacheByBatchFn[uint64, models.Comments](common.GetCommentByIds, c.CommentsCacheTime)
2023-01-12 12:42:16 +00:00
}
func ClearCache() {
searchPostIdsCache.ClearExpired()
postsCache.ClearExpired()
postMetaCache.ClearExpired()
postListIdsCache.ClearExpired()
monthPostsCache.ClearExpired()
postContextCache.ClearExpired()
usersCache.ClearExpired()
commentsCache.ClearExpired()
usersNameCache.ClearExpired()
}
func FlushCache() {
searchPostIdsCache.Flush()
postsCache.Flush()
postMetaCache.Flush()
postListIdsCache.Flush()
monthPostsCache.Flush()
postContextCache.Flush()
usersCache.Flush()
commentsCache.Flush()
usersCache.Flush()
}
2023-01-17 15:18:31 +00:00
func Archives(ctx context.Context) (r []models.PostArchive) {
2023-01-12 12:42:16 +00:00
return archivesCaches.getArchiveCache(ctx)
}
type Arch struct {
2023-01-17 15:18:31 +00:00
data []models.PostArchive
2023-01-12 12:42:16 +00:00
mutex *sync.Mutex
2023-01-17 15:18:31 +00:00
setCacheFunc func(context.Context) ([]models.PostArchive, error)
2023-01-12 12:42:16 +00:00
month time.Month
}
2023-01-17 15:18:31 +00:00
func (c *Arch) getArchiveCache(ctx context.Context) []models.PostArchive {
2023-01-12 12:42:16 +00:00
l := len(c.data)
m := time.Now().Month()
if l > 0 && c.month != m || l < 1 {
r, err := c.setCacheFunc(ctx)
if err != nil {
logs.ErrPrintln(err, "set cache err[%s]")
return nil
}
c.mutex.Lock()
defer c.mutex.Unlock()
c.month = m
c.data = r
}
return c.data
}
2023-01-17 15:18:31 +00:00
func Categories(ctx context.Context) []models.TermsMy {
2023-01-12 12:42:16 +00:00
r, err := categoryCaches.GetCache(ctx, time.Second, ctx)
logs.ErrPrintln(err, "get category ")
return r
}