- 新增 internal/cache/home_cache.go,实现带 TTL 的首页文章列表内存缓存 - frontend.go 首页 handler 优先读取缓存,未命中/过期时查询 DB 并回填 - PostService 注入失效回调,在 Create/Update/Delete/Approve 后自动失效缓存 - 减少首页每次请求都查 DB 的开销
56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package cache
|
||
|
||
import (
|
||
"sync"
|
||
"time"
|
||
|
||
"metazone.cc/metalab/internal/model"
|
||
)
|
||
|
||
// HomePageCache 首页内存缓存,30 秒 TTL,创建/更新/删除/审核通过时失效
|
||
type HomePageCache struct {
|
||
mu sync.RWMutex
|
||
posts []model.Post
|
||
total int64
|
||
expires time.Time
|
||
ttl time.Duration
|
||
}
|
||
|
||
// NewHomePageCache 创建首页缓存,ttl 为缓存有效期
|
||
func NewHomePageCache(ttl time.Duration) *HomePageCache {
|
||
return &HomePageCache{ttl: ttl}
|
||
}
|
||
|
||
// Get 返回缓存数据,ok=false 表示缓存未命中或已过期
|
||
func (c *HomePageCache) Get() (posts []model.Post, total int64, ok bool) {
|
||
c.mu.RLock()
|
||
defer c.mu.RUnlock()
|
||
if time.Now().After(c.expires) {
|
||
return nil, 0, false
|
||
}
|
||
// 返回浅拷贝以防止调用方修改缓存内部数据
|
||
copied := make([]model.Post, len(c.posts))
|
||
copy(copied, c.posts)
|
||
return copied, c.total, true
|
||
}
|
||
|
||
// Set 写入缓存数据
|
||
func (c *HomePageCache) Set(posts []model.Post, total int64) {
|
||
c.mu.Lock()
|
||
defer c.mu.Unlock()
|
||
// 深拷贝一份避免外部修改影响缓存
|
||
c.posts = make([]model.Post, len(posts))
|
||
copy(c.posts, posts)
|
||
c.total = total
|
||
c.expires = time.Now().Add(c.ttl)
|
||
}
|
||
|
||
// Invalidate 主动失效缓存
|
||
func (c *HomePageCache) Invalidate() {
|
||
c.mu.Lock()
|
||
defer c.mu.Unlock()
|
||
c.posts = nil
|
||
c.total = 0
|
||
c.expires = time.Time{}
|
||
}
|