6个稳定版本
1.4.1 | 2023年5月26日 |
---|---|
1.4.0 | 2023年5月22日 |
#291 in 缓存
每月下载量 64
43KB
820 行
file-lfu
基于目录的最少使用缓存。
已弃用
API设计不当,且支持缓存的后端算法不适合此crate的预期用途。我 强烈建议 您不要将此crate用于任何半正式的项目。
快速开始
- 为要缓存的类型实现
AsyncFileRepr
。- 如果需要使用自己的类型作为缓存键,可选地为您的缓存键类型实现
Key
。
- 如果需要使用自己的类型作为缓存键,可选地为您的缓存键类型实现
- 使用
FileBackedLfuCache::init
初始化缓存。 - 使用
FileBackedLfuCache::push
添加新项目到缓存。- 直到缓存容量超过,项目不会刷新到磁盘。
- 使用
FileBackedLfuCache::{flush, flush_all}
手动触发刷新。
- 使用
FileBackedLfuCache::{get, get_or_load}
不可变地访问项目。 - 使用
FileBackedLfuCache::{get_mut, get_or_load_mut}
可变地访问项目。
示例
use file_lfu::FileBackedLfuCache;
use uuid::Uuid;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut cache = FileBackedLfuCache<Uuid, Foo>::init("/path/to/data/dir", 2)?;
// cache is not full, so no flushes or evictions
let key0 = cache.push(Foo::new("foo0"))?;
let key1 = cache.push(Foo::new("foo1"))?;
for _ in 0..10 {
// use `foo0` a bunch of times to boost its usage frequency
let _foo0_arc = cache.get(&key0)?; // to use it immutably
let _foo0_mut_ref = cache.get_mut(&key0)?; // to use it mutably
// we use `get` and `get_mut` because we are sure `foo0` is in cache
// if unsure, use `get_or_load` and `get_or_load_mut`
}
// cache is now full, so the least frequently used item (currently `foo1`)
// will be evicted from cache and flushed to disk
let _key2 = cache.push(Foo::new("foo2"))?;
// now the cache contains `foo0` and `foo2`
// when `foo1` is needed again, it will be loaded from disk
// again, because the cache is still full, `foo2` will be evicted from cache
// and flushed to disk
let _foo1_arc = cache.get_or_load(&key1)?;
let _foo1_mut_ref = cache.get_or_load_mut(&key1)?;
// trigger a manual flush before program terminates
cache.flush_all()?;
Ok(())
}
功能
utf8-paths
使用来自 camino
的 Utf8Path
和 Utf8PathBuf
进行所有操作。
使用此功能会将 camino
添加为依赖项。
默认禁用此功能。
uuid-as-key
为 uuid::Uuid
实现一个 Key
特性,以便可以直接将其用作键。
使用此功能会将 uuid
添加为依赖项。
此功能默认启用。
为什么不只依赖于操作系统和/或文件系统级别的缓存呢?
如果可能的话,你应该这样做。这是免费的,并且不需要开发者进行任何工作。
然而,在某些情况下,你可能希望对缓存的内容以及是否缓存有更细粒度的控制。这时候这个 crate 就派上用场了。
值得注意的是,这个 crate 允许你在加载和刷新时执行任意的序列化和反序列化,使你能够缓存底层数据在内存中的更容易处理的表示。
依赖项
~0.4–1MB
~23K SLoC