用分片代替排队
lru-next 把"一个全局锁的缓存"拆成 256 个独立分片,每把锁只覆盖 1/256 的数据——并发越高,收益越大。
核心目标
- 256 个分片FNV-1a 哈希路由,单把锁覆盖仅 1/256 的数据
- 无锁 LRU 核心lruCore 不内嵌锁,完全委托外层 RWMutex,零嵌套锁开销
- 缓存雪崩防护慢路径在分片锁内串行化 loader 调用,等同内置 singleflight
- 脏数据优雅降级loader 失败时返回旧过期值,不中断服务
架构一览
Cache[T] ← 泛型 API
└─ Shard[0..255] ← 256 分片
└─ lruCore ← 无锁 LRU + hashmap
全局 vs 分片锁
全局锁: 1 把锁管全部 → 排队严重
分片锁: 256 把锁各管 1/256 → 接近无锁
同类对比
以下对比基于 Intel i5-8265U @ 1.60GHz · 10K key 固定池 · RunParallel 并发模式。
golang-lru v2lru-next
并发写入
并发读取
混合负载 (9:1)
LRU 淘汰
TTL 过期
雪崩防护
脏数据降级