Documentation
¶
Overview ¶
Package memkv 进程内字符串 TTL KV(主包仅依赖标准库与 oekit/pkg/cache):单机内存模式的共享存储原语。
服务对象:Redis 消费方(anonymous/presign 等持窄接口的域)在 redis.host 为空 时的等价兜底——取件码映射、直传会话这类短 TTL 数据。语义对齐 Redis 最小子集: Get / Set / SetNX(原子)/ Del + TTL 过期;不做持久化、不跨进程。
收编 oekit/pkg/cache.LocalCache(2026-11-03) ¶
手搓 map+mutex+TTL 表退役,本包只保留「Redis 最小子集 API 形状」的薄门面 (字符串键值、无 ctx)。收编顺带根治一个数据竞争:旧实现的周期清扫协程 (startGC)裸调 sweepLocked(其文档要求「调用方须已持锁」)⇒ 与读写路径的 s.mu 并发访问同一张 map(-race 必红,线上只因 10min 清扫窗口罕见才未炸)。
与旧实现的有意差异(满载语义,对齐 lockout 内存兜底先例的「差异记录在案」 纪律):
- 旧:满载先清扫过期、仍满则**整表重置**(保命优先于保留数据);
- 新:LocalCache MaxSize=DefaultMax + FIFO 逐出(写满时淘汰最早写入)。
防 DoS 的内存上界不变(DefaultMax);差异只在「被撑爆时的附带伤害面」—— 整表重置殃及全部键,FIFO 只逐出最旧的键。两者同属「缓存/标记失效、回源 兜底」的代价类别(DB 仍是唯一真相源),FIFO 严格更温和。
另两处口径差(均已核消费面无感):
- 过期回收:旧=10min 周期清扫+读路径惰性删除;新=读路径惰性删除(含 SetNX 的「过期按不存在」)+满载 FIFO 逐出,无后台清扫 goroutine (NullTTL 显式禁用 ⇒ sweepNeeded=false,进程内零常驻协程)。过期 尸体最多驻留到被读到或被逐出,内存上界不变。
- Del 计数:旧=map 存在性(过期未回收条目也计数);新=删前逻辑存在性 统计(过期即不存在)。单线程语义一致;与并发写入交错时计数为近似 ——消费面无人读计数(redisshim 消费点全走 .Err(),已核)。
消费方 ≥3 处后可评估上收 kit(当前 anonymous/presign 两个适配层复用本包)。
Index ¶
Constants ¶
const ( // DefaultMax 单表容量上限(LocalCache MaxSize:写满 FIFO 逐出,语义见 // 包文档「满载语义」)。攻击面同旧口径:海量唯一键刷表时内存有界。 DefaultMax = 65536 // DefaultGCPeriod 历史自管清扫周期。现无自管清扫(过期回收口径见包 // 文档),保留常量兼容既有引用。 DefaultGCPeriod = 10 * time.Minute )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
Store 字符串 TTL KV。并发安全;零常驻 goroutine(无后台清扫件)。
Directories
¶
| Path | Synopsis |
|---|---|
|
Package redisshim 单机内存模式下 go-redis 命令面的等价实现(memkv.Store 的 redis 兼容垫片):redis.host 为空时 anonymous/presign 等域的 NewService 以此 兜底,取件码映射/直传会话等短 TTL 数据存进程内——不跨进程共享、重启即失, DB 仍是唯一真相源。
|
Package redisshim 单机内存模式下 go-redis 命令面的等价实现(memkv.Store 的 redis 兼容垫片):redis.host 为空时 anonymous/presign 等域的 NewService 以此 兜底,取件码映射/直传会话等短 TTL 数据存进程内——不跨进程共享、重启即失, DB 仍是唯一真相源。 |