Documentation
¶
Overview ¶
Package lrucache 提供有界 LRU 缓存,支持独立实例和命名共享实例,可设置实例默认 TTL 和单条目 TTL。 它位于基础功能层,使用 ttlcache v3。
应用启动时可创建独立实例并注入业务服务,也可按名称注册进程内共享实例。 以下示例需导入 time 和 github.com/bpcoder16/pixiu/infra/lrucache:
sourceCodes := map[string]string{"+86": "CN"}
_, err := lrucache.NewNamed("country-codes", lrucache.Config[string, string]{
Capacity: 1_000,
TTL: 24 * time.Hour,
Loader: func(key string) (string, bool) {
value, found := sourceCodes[key]
return value, found
},
})
if err != nil {
return err
}
countryCodes, err := lrucache.Named[string, string]("country-codes")
if err != nil {
return err
}
code, found := countryCodes.Get("+86")
_, _ = code, found
New 仍可创建不注册的独立缓存。NewNamed 拒绝空名称;同名同类型重复注册返回首次实例,忽略后续配置。 同名不同类型返回错误;首次创建失败不占用名称,可用有效配置重试。 Named 在名称不存在或键值类型不匹配时返回错误,不回退到其他实例。 命名实例在进程内持续存在;可在业务初始化时获取一次并保存指针。 Get 命中会更新 LRU 顺序,默认不延长条目 TTL;配置 RefreshTTLOnGet: true 后会续期。 配置 Loader 后,未命中时会同步调用它;返回找到的值会按实例默认 TTL 写入。 Loader 不传递 context 或错误,同键并发未命中可能重复加载。 Loader 回源期间若调用 Delete 或 DeleteAll,回源完成后仍可能重新写入该值。 GetOrSet 和 GetOrSetFunc 提供原子检查及写入,返回的 bool 表示检查时是否存在; 返回值在解锁后读取,并发 Set 时可能与 bool 不对应同一时刻。 两者均不触发 Loader。GetOrSetFunc 的函数在缓存锁内执行,应快速完成且不可重入缓存。 Stats 的 Hits 和 Misses 统计 Get、GetOrSet、GetOrSetFunc 与 GetAndDelete 的查找。 Has 和 GetAndDelete 不触发 Loader;Keys、Items 仅访问未过期条目。 Range 和 RangeBackwards 暂不提供:底层 ttlcache v3.4.1 在 LRU 顺序变化时可能重复遍历且无法结束。 待上游修复并升级依赖、验证后再考虑恢复;无需顺序的遍历可使用 Keys 或 Items。 SetWithTTL 的 0 表示该条目不过期。 不启动后台清理;写入前会清理过期条目,纯读期间可按需调用 DeleteExpired。 容量按条目数计算;可变引用类型的并发安全和拷贝由调用方负责。
Index ¶
- type Cache
- func (c *Cache[K, V]) Delete(key K)
- func (c *Cache[K, V]) DeleteAll()
- func (c *Cache[K, V]) DeleteExpired()
- func (c *Cache[K, V]) Get(key K) (V, bool)
- func (c *Cache[K, V]) GetAndDelete(key K) (V, bool)
- func (c *Cache[K, V]) GetOrSet(key K, value V) (V, bool)
- func (c *Cache[K, V]) GetOrSetFunc(key K, fn func() V) (V, bool)
- func (c *Cache[K, V]) Has(key K) bool
- func (c *Cache[K, V]) Items() map[K]V
- func (c *Cache[K, V]) Keys() []K
- func (c *Cache[K, V]) Len() int
- func (c *Cache[K, V]) Set(key K, value V)
- func (c *Cache[K, V]) SetWithTTL(key K, value V, ttl time.Duration) error
- func (c *Cache[K, V]) Stats() Stats
- type Config
- type Stats
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Cache ¶
type Cache[K comparable, V any] struct { // contains filtered or unexported fields }
Cache 是并发安全、有界且可按条目设置过期时间的 LRU 缓存。零值不可用,须经 New 创建。
func Named ¶
func Named[K comparable, V any](name string) (*Cache[K, V], error)
Named 返回已注册的命名缓存。名称不存在或请求的键值类型不匹配时返回错误。 调用方可在初始化时获取一次并保存指针,避免业务热路径重复查找注册表。
func New ¶
func New[K comparable, V any](cfg Config[K, V]) (*Cache[K, V], error)
New 创建独立缓存实例。容量必须大于 0,默认 TTL 不得为负。 实例固定启用容量上限;默认读命中不续期,可通过 RefreshTTLOnGet 开启续期。
func NewNamed ¶
NewNamed 首次创建并注册命名缓存,后续同名、同类型调用返回已有实例,忽略传入配置。 名称不能为空;类型不匹配返回错误。创建失败不占用名称,可用有效配置重试。 各名称的容量、TTL、条目和统计互不影响。
func (*Cache[K, V]) DeleteAll ¶
func (c *Cache[K, V]) DeleteAll()
DeleteAll 删除此实例的全部条目,包括已过期但尚未清理的条目。
func (*Cache[K, V]) DeleteExpired ¶
func (c *Cache[K, V]) DeleteExpired()
DeleteExpired 立即删除此实例中已经过期的条目。
func (*Cache[K, V]) Get ¶
Get 读取未过期条目。命中会更新 LRU 顺序;是否续期由 RefreshTTLOnGet 决定。 未命中时若配置 Loader,则同步加载;加载成功按实例默认 TTL 写入并返回。
func (*Cache[K, V]) GetAndDelete ¶
GetAndDelete 原子地读取并删除未过期条目;未命中时不触发 Loader。
func (*Cache[K, V]) GetOrSet ¶
GetOrSet 返回已有值,或按实例默认 TTL 写入给定值;bool 表示检查时是否存在。 检查与写入原子执行,但返回值在解锁后读取,并发 Set 时可能读到后续写入的值。 此方法不会触发 Loader。
func (*Cache[K, V]) GetOrSetFunc ¶
GetOrSetFunc 返回已有值,或在未命中时调用 fn 生成并写入值;bool 表示检查时是否存在。 检查与写入原子执行,但返回值在解锁后读取,并发 Set 时可能读到后续写入的值。 fn 在缓存锁内执行,须快速完成且不可调用同一缓存的方法;此方法不会触发 Loader。
func (*Cache[K, V]) Set ¶
func (c *Cache[K, V]) Set(key K, value V)
Set 使用实例默认 TTL 写入。覆盖已有键时从本次写入重新计时。
func (*Cache[K, V]) SetWithTTL ¶
SetWithTTL 使用条目 TTL 写入。TTL 为 0 表示不过期;负数会返回错误且不写入。