-
Notifications
You must be signed in to change notification settings - Fork 0
xlru
omeyang edited this page Sep 17, 2026
·
1 revision
稳定性:Stable · 覆盖率:100.0% · 源码:
pkg/util/xlru
LRU 缓存(泛型 + TTL)。包装 hashicorp/golang-lru/v2/expirable,加 Close 控制与 OnEvicted 死锁文档。
- 进程内热点数据缓存(如配置、平台信息)
- 带 TTL 自动过期
- 容量上限触发 LRU 淘汰
- 跨进程:用 xcache
- 需要持久化:本包纯内存
import "github.com/omeyang/xkit/pkg/util/xlru"
c, err := xlru.New[string, *User](
1000, // 容量
5*time.Minute, // TTL,0 表示不过期
xlru.WithOnEvicted(func(k string, v *User) {
slog.Info("evicted", "key", k)
}),
)
defer c.Close()
c.Add("k1", &User{...})
if v, ok := c.Get("k1"); ok { /* ... */ }| 名称 | 说明 |
|---|---|
Cache[K, V] |
泛型缓存 |
New[K, V](size, ttl, opts...) (*Cache, error) |
构造 |
Add / Get / Peek / Remove / Contains |
标准 LRU 操作 |
Len / Keys / Purge / Close |
管理操作 |
WithOnEvicted(fn) |
淘汰回调( |
-
closed atomic.Bool守护所有方法 - Contains 用 Peek 实现:上游 Contains 不过滤过期 entry
- TTL=0 透传上游 noEvictionTTL=10 年哨兵
- OnEvicted 死锁风险:在上游 mutex 内执行,文档化约束
- Close TOCTOU 窗口:可接受设计取舍,残留 entry 不可见且会被 GC
-
stopCleanupGoroutine用 reflect+unsafe,有测试TestStopCleanupGoroutine_UpstreamStructAssert守护上游结构变化 - Close 后 deleteExpired 可能滞留 TTL/100:上游不可中断 sleep,文档化
- 模式:
- ADR:
- API:api.md#pkgutilxlru