1 个不稳定版本

0.1.0 2021年5月4日

#270 in 缓存

Apache-2.0

94KB
2K SLoC

CCache, 可组合缓存

一些缓存是多个其他缓存的组合。本项目试图创建一个最小框架以实现此类缓存,并提供通用的哈希表和特性,以便以任何方式重用和重新实现一切。

我们还提供了一种(可选)方法,可以将其他元数据与缓存中的值一起存储,并在每次 get/insert 操作时触发回调。

已实现的缓存

  • LRU
  • SLRU
  • W-TiniyLFU(扫描变体,命名为 SW-TinyLFU)

扫描窗口 Tiny LFU

基本思想是根据这篇论文实现 W-TLFU 缓存

W-TLFU 通过在每个 X 次访问后都将计数器减半来工作。
这在大缓存中似乎有问题,因此我们实现了一种懒扫描:不是只有一个计数器,每个对象都保持一个生成(Day/Night)以及计数器。
每次访问对象时,我们都会扫描它和下一个对象。
如果生成不是当前生成,则计数器减半。

由于内存对齐,SW-TLFU 不实现“门卫”布隆过滤器,并直接在缓存使用的哈希表中存储计数器。

状态/需要帮助

  • 共享 LRU/SLRU/SW-TLFU 完成
  • 完全未测试
  • 未进行基准测试
  • 我们可能可以通过使用较小的索引来简化 user::Entry 中的指针。
  • 一些 unsafe 的使用,希望可以解决,但我对 rust 的了解不够。
  • 需要更多文档
  • 所有缓存的公共特性
  • 除了 get/insert 之外,还有更多高级方法?
  • 公共分配器
  • 具有更少参数的模板包装器

结构

哈希表

由于标准哈希表不允许通过索引访问其条目,并且不稳定(对象在插入/删除时可以移动),我们必须重新实现一个哈希表。

实现基于与 hashbrown 使用的相同的 RawTable

用户::条目

您可以根据提供必要的特性重新实现自己的条目类型。

您可以添加或更好地隐藏一些字段,例如 swtlfu::Full32 将生成和计数器压缩到缓存 ID 中。

条目必须知道它们位于哪个子缓存中,但如果您只使用一个缓存,则可以使用 PhantomData

共享XXX

这是共享缓存的实现。通过共享缓存,我们指的是一个或多个可能更多的缓存,这些缓存复用同一个(共享)哈希表。

依赖项

~1.5–2.2MB
~39K SLoC