#lru-cache #cache #lru

无std lazy-lru

具有懒删除功能的最近最少使用(LRU)缓存实现

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 缓存

Download history 11629/week @ 2024-05-03 10274/week @ 2024-05-10 6569/week @ 2024-05-17 8001/week @ 2024-05-24 11732/week @ 2024-05-31 12391/week @ 2024-06-07 11615/week @ 2024-06-14 11230/week @ 2024-06-21 11522/week @ 2024-06-28 12221/week @ 2024-07-05 11404/week @ 2024-07-12 13384/week @ 2024-07-19 14760/week @ 2024-07-26 14169/week @ 2024-08-02 13850/week @ 2024-08-09 13345/week @ 2024-08-16

59,248 每月下载量
用于 18 个存储库(通过 solana-ledger

MIT 许可证

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