#cache #disk #tokio #lru

remember-this

一个简单的机制,用于在内存和磁盘上缓存数据。使用 tokio

1 个不稳定版本

0.1.0 2020年11月27日

#325缓存

Apache-2.0

23KB
374

一个简单的缓存到磁盘机制

该crate提供了一个简单、零配置的机制,用于在内存和磁盘上缓存数据。

一个典型的用例是需要处理对网络或数据库的长时间运行查询的应用程序。如果应用程序由于某些原因失败,或者它是一个命令行应用程序,缓存将允许应用程序从停止的地方继续运行。

示例

extern crate remember_this;
#[macro_use]
extern crate tokio;

use remember_this::*;

#[tokio::main]
async fn main() {
    // A cache manager lets us organize several strongly-typed caches.
    let manager_options = CacheManagerOptions::builder()
        .path("/tmp/test_reopen.db")
        .build();
    let manager = CacheManager::new(&manager_options).unwrap();

    // An individual cache is strongly-typed.
    //
    // With the default policy, items remain 1h in memory and 1d on disk,
    // this should be sufficient for our test.
    let cache_options = CacheOptions::default();
    let cache = manager.cache("my_cache", &cache_options).unwrap();

    // Fill the cache. Imagine that it's actually a long computation.
    //
    // Recall that async blocks are computed lazily in Rust, so `async { i * i }`
    // will only execute if it's not in the cache yet.
    for i in 0..100 {
        let obtained = cache.get_or_insert_infallible(&i, async { i * i }).await.unwrap();
        assert_eq!(*obtained, i * i);
    }

    // Let's refetch from the cache.
    for i in 0..100 {
        // Here, the async blocks are actually not executed.
        let obtained = cache.get_or_insert_infallible(&i, async { panic!("We shouldn't reach this point"); }).await.unwrap();
        assert_eq!(*obtained, i * i);
    }
}

一些注意事项和特性

  • 单个缓存可以有一个格式版本号。这样,如果您的数据格式在细微方面发生了变化,通过增加版本号,您可以确保不会从磁盘读取“错误”的数据。
  • 存储格式是sled上的flexbuffers。这在我们从磁盘加载时提供了动态类型的能力,从而降低了应用程序意外读取格式不正确版本的风险。

待办事项

  • 目前,当从内存中获取数据时,磁盘上的LRU不会被更新。

依赖项

~7–9MB
~149K SLoC