6个稳定版本

1.4.1 2023年5月26日
1.4.0 2023年5月22日

#291 in 缓存

Download history 9/week @ 2024-03-09 16/week @ 2024-03-16 32/week @ 2024-03-30 8/week @ 2024-04-06

每月下载量 64

MIT 许可证

43KB
820

file-lfu

基于目录的最少使用缓存。

crates.io docs.rs

已弃用

API设计不当,且支持缓存的后端算法不适合此crate的预期用途。我 强烈建议 您不要将此crate用于任何半正式的项目。

快速开始

  1. 为要缓存的类型实现 AsyncFileRepr
    • 如果需要使用自己的类型作为缓存键,可选地为您的缓存键类型实现 Key
  2. 使用 FileBackedLfuCache::init 初始化缓存。
  3. 使用 FileBackedLfuCache::push 添加新项目到缓存。
    • 直到缓存容量超过,项目不会刷新到磁盘。
    • 使用 FileBackedLfuCache::{flush, flush_all} 手动触发刷新。
  4. 使用 FileBackedLfuCache::{get, get_or_load} 不可变地访问项目。
  5. 使用 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

使用来自 caminoUtf8PathUtf8PathBuf 进行所有操作。

使用此功能会将 camino 添加为依赖项。

默认禁用此功能。

uuid-as-key

uuid::Uuid 实现一个 Key 特性,以便可以直接将其用作键。

使用此功能会将 uuid 添加为依赖项。

此功能默认启用。

为什么不只依赖于操作系统和/或文件系统级别的缓存呢?

如果可能的话,你应该这样做。这是免费的,并且不需要开发者进行任何工作。

然而,在某些情况下,你可能希望对缓存的内容以及是否缓存有更细粒度的控制。这时候这个 crate 就派上用场了。

值得注意的是,这个 crate 允许你在加载和刷新时执行任意的序列化和反序列化,使你能够缓存底层数据在内存中的更容易处理的表示。

依赖项

~0.4–1MB
~23K SLoC