lrucache

package
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2026 License: Apache-2.0 Imports: 4 Imported by: 0

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

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

func NewNamed[K comparable, V any](name string, cfg Config[K, V]) (*Cache[K, V], error)

NewNamed 首次创建并注册命名缓存,后续同名、同类型调用返回已有实例,忽略传入配置。 名称不能为空;类型不匹配返回错误。创建失败不占用名称,可用有效配置重试。 各名称的容量、TTL、条目和统计互不影响。

func (*Cache[K, V]) Delete

func (c *Cache[K, V]) Delete(key K)

Delete 删除指定键;键不存在时不执行操作。

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

func (c *Cache[K, V]) Get(key K) (V, bool)

Get 读取未过期条目。命中会更新 LRU 顺序;是否续期由 RefreshTTLOnGet 决定。 未命中时若配置 Loader,则同步加载;加载成功按实例默认 TTL 写入并返回。

func (*Cache[K, V]) GetAndDelete

func (c *Cache[K, V]) GetAndDelete(key K) (V, bool)

GetAndDelete 原子地读取并删除未过期条目;未命中时不触发 Loader。

func (*Cache[K, V]) GetOrSet

func (c *Cache[K, V]) GetOrSet(key K, value V) (V, bool)

GetOrSet 返回已有值,或按实例默认 TTL 写入给定值;bool 表示检查时是否存在。 检查与写入原子执行,但返回值在解锁后读取,并发 Set 时可能读到后续写入的值。 此方法不会触发 Loader。

func (*Cache[K, V]) GetOrSetFunc

func (c *Cache[K, V]) GetOrSetFunc(key K, fn func() V) (V, bool)

GetOrSetFunc 返回已有值,或在未命中时调用 fn 生成并写入值;bool 表示检查时是否存在。 检查与写入原子执行,但返回值在解锁后读取,并发 Set 时可能读到后续写入的值。 fn 在缓存锁内执行,须快速完成且不可调用同一缓存的方法;此方法不会触发 Loader。

func (*Cache[K, V]) Has

func (c *Cache[K, V]) Has(key K) bool

Has 判断键是否对应未过期条目,不更新 LRU 顺序或 TTL,也不触发 Loader。

func (*Cache[K, V]) Items

func (c *Cache[K, V]) Items() map[K]V

Items 返回未过期条目的键值映射;映射独立,值为浅拷贝。

func (*Cache[K, V]) Keys

func (c *Cache[K, V]) Keys() []K

Keys 返回未过期键的切片,顺序不作保证。

func (*Cache[K, V]) Len

func (c *Cache[K, V]) Len() int

Len 返回当前未过期的条目数。

func (*Cache[K, V]) Set

func (c *Cache[K, V]) Set(key K, value V)

Set 使用实例默认 TTL 写入。覆盖已有键时从本次写入重新计时。

func (*Cache[K, V]) SetWithTTL

func (c *Cache[K, V]) SetWithTTL(key K, value V, ttl time.Duration) error

SetWithTTL 使用条目 TTL 写入。TTL 为 0 表示不过期;负数会返回错误且不写入。

func (*Cache[K, V]) Stats

func (c *Cache[K, V]) Stats() Stats

Stats 返回此实例的累计统计快照。

type Config

type Config[K comparable, V any] struct {
	Capacity        int               // 必填,最大条目数,必须大于 0。
	TTL             time.Duration     // 可选,默认过期时间;0 表示默认不过期。
	RefreshTTLOnGet bool              // 可选,命中时重新计算过期时间;默认 false,不续期。
	Loader          func(K) (V, bool) // 可选,未命中时同步加载;返回 false 表示未找到,须支持并发调用。
}

Config 配置单个缓存实例。

type Stats

type Stats struct {
	Hits       uint64 // Get、GetOrSet、GetOrSetFunc 和 GetAndDelete 的缓存命中次数。
	Misses     uint64 // 上述读取的缓存未命中次数,包括 Loader 成功回源的读取。
	Insertions uint64 // 新键写入次数。
	Updates    uint64 // 已有键的值被覆盖次数。
	Evictions  uint64 // 条目移除次数,包括容量淘汰、删除和过期清理。
}

Stats 是单个缓存实例创建以来的累计统计。删除和过期清理也计入 Evictions。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL