Files
common-server-public/bbs-go/server/internal/cache/user_cache.go
2025-03-03 17:43:50 +08:00

95 lines
2.2 KiB
Go

package cache
import (
"errors"
"time"
"bbs-go/internal/models"
"bbs-go/internal/repositories"
"github.com/goburrow/cache"
"github.com/mlogclub/simple/common/dates"
"github.com/mlogclub/simple/sqls"
)
type userCache struct {
cache cache.LoadingCache
scoreRankCache cache.LoadingCache
checkInRankCache cache.LoadingCache
}
var UserCache = newUserCache()
func newUserCache() *userCache {
return &userCache{
cache: cache.NewLoadingCache(
func(key cache.Key) (value cache.Value, e error) {
value = repositories.UserRepository.Get(sqls.DB(), key2Int64(key))
if value == nil {
e = errors.New("数据不存在")
}
return
},
cache.WithMaximumSize(1000),
cache.WithExpireAfterAccess(30*time.Minute),
),
scoreRankCache: cache.NewLoadingCache(
func(key cache.Key) (value cache.Value, e error) {
value = repositories.UserRepository.Find(sqls.DB(), sqls.NewCnd().Desc("score").Limit(10))
if value == nil {
e = errors.New("数据不存在")
}
return
},
cache.WithMaximumSize(10),
cache.WithRefreshAfterWrite(10*time.Minute),
),
checkInRankCache: cache.NewLoadingCache(
func(key cache.Key) (value cache.Value, e error) {
today := dates.GetDay(time.Now())
value = repositories.CheckInRepository.Find(sqls.DB(),
sqls.NewCnd().Eq("latest_day_name", today).Asc("update_time").Limit(10))
return
},
cache.WithMaximumSize(10),
cache.WithExpireAfterAccess(1*time.Hour),
),
}
}
func (c *userCache) Get(userId int64) *models.User {
if userId <= 0 {
return nil
}
val, err := c.cache.Get(userId)
if err != nil {
return nil
}
return val.(*models.User)
}
func (c *userCache) Invalidate(userId int64) {
c.cache.Invalidate(userId)
}
func (c *userCache) GetScoreRank() []models.User {
val, err := c.scoreRankCache.Get("data")
if err != nil {
return nil
}
return val.([]models.User)
}
func (c *userCache) GetCheckInRank() []models.CheckIn {
today := dates.GetDay(time.Now())
val, err := c.checkInRankCache.Get(today)
if err != nil {
return nil
}
return val.([]models.CheckIn)
}
func (c *userCache) RefreshCheckInRank() {
c.checkInRankCache.Refresh(dates.GetDay(time.Now()))
}