## CI 修复 (P0/P1) P0 — 编译阻塞: - interfaces.go: postUseCase ISP 接口移除不用的 Create/Update/Delete P1 — 必须修复: - ST1000: 为 13 个包添加包注释 (common/config/model/service/...) - ST1005: redis_store.go 全部错误消息改为小写开头 - errcheck (19处): defer Close()→闭包忽略, notifier.Create→_=, r.Run→检查error - errorlint (9处): switch-on-error→errors.Is 链, ==→errors.Is - ST1020/ST1022: 导出符号注释以符号名开头 P2 — 安全评审: - gosec (12处): G203/G301/G304/G306 添加 nolint 注释并附理由 P3 — 清理: - unused: 移除 hasUnicode/energyStore/current/energyAdminUseCase - gofumpt + goimports 全量格式化 (35+ 文件)
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
// Package cache 提供首页等热点数据的内存缓存层。
|
||
package cache
|
||
|
||
import (
|
||
"sync"
|
||
"time"
|
||
|
||
"metazone.cc/mce/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{}
|
||
}
|