feat: 首页增加内存缓存(30s TTL)
- 新增 internal/cache/home_cache.go,实现带 TTL 的首页文章列表内存缓存 - frontend.go 首页 handler 优先读取缓存,未命中/过期时查询 DB 并回填 - PostService 注入失效回调,在 Create/Update/Delete/Approve 后自动失效缓存 - 减少首页每次请求都查 DB 的开销
This commit is contained in:
55
internal/cache/home_cache.go
vendored
Normal file
55
internal/cache/home_cache.go
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
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{}
|
||||
}
|
||||
Reference in New Issue
Block a user