4次发布
0.1.3 | 2024年8月8日 |
---|---|
0.1.2 | 2024年4月7日 |
0.1.1 | 2024年4月7日 |
0.1.0 | 2024年3月13日 |
#41 in 缓存
59,248 每月下载量
用于 18 个存储库(通过 solana-ledger)
23KB
425 代码行
懒LRU缓存
通常,LRU缓存是通过哈希表和双向链表的组合来实现的。双向链表跟踪项目被访问的顺序。当条目被访问或插入到缓存中时,其对应的引用会被移动到(或插入)链表的头部。这样做,最近最少使用的项目总是在链表的末尾,并且当缓存大小超过其指定的容量时立即被删除。
此存储库实现了一个具有 懒删除 的LRU缓存替代方案
- 每个条目维护一个关联的序数值,表示条目最后一次被访问的时间。
- 缓存允许增长到指定容量的2倍,在此期间不会进行删除,此时,超出部分基于LRU策略在线性时间内进行删除,从而实现 平均 的
O(1)
性能。
在许多使用案例中,这可以允许缓存存储2倍容量,并且可以容忍性能的平均性质,如本存储库中的基准测试所示,这会导致更好的平均性能
test bench_get_eager ... bench: 21,434 ns/iter (+/- 3,565)
test bench_get_lazy ... bench: 16,514 ns/iter (+/- 385)
test bench_put_eager ... bench: 52,277 ns/iter (+/- 25,473)
test bench_put_lazy ... bench: 33,117 ns/iter (+/- 5,057)
此外,在积极实现中,查找需要一个可变引用 &mut self
以允许更新内部链表。在多线程环境中,这需要在读取路径上也对缓存进行独占写锁,这可能会加剧锁竞争。使用懒删除,序数值可以通过原子操作进行更新,从而允许查找时使用共享锁。
依赖项
~2MB
~25K SLoC