1 个不稳定版本
0.1.0 | 2021年5月4日 |
---|
#270 in 缓存
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