3个版本

0.1.4 2024年7月29日
0.1.3 2022年7月4日
0.1.2 2022年6月16日
0.1.1 2022年6月16日
0.1.0 2022年6月16日

336数据库接口

Download history 493/week @ 2024-05-03 323/week @ 2024-05-10 316/week @ 2024-05-17 316/week @ 2024-05-24 263/week @ 2024-05-31 229/week @ 2024-06-07 298/week @ 2024-06-14 224/week @ 2024-06-21 193/week @ 2024-06-28 249/week @ 2024-07-05 311/week @ 2024-07-12 356/week @ 2024-07-19 453/week @ 2024-07-26 324/week @ 2024-08-02 360/week @ 2024-08-09 352/week @ 2024-08-16

每月 1,516 次下载

Apache-2.0

17KB
390

sqlite-cache

crates.io

基于SQLite的Rust磁盘缓存。

用法

let cache = Cache::new(
    CacheConfig::default(),
    rusqlite::Connection::open_in_memory().unwrap(),
).unwrap();
let topic = cache.topic("test-topic").unwrap();
assert!(topic.get("hello").unwrap().is_none());
topic.set("hello", b"world", Duration::from_secs(60))
assert!(&topic.get("hello").unwrap().unwrap().data[..] == b"world");

锁定更新

此库支持锁定更新,以防止缓存未命中时的惊群问题。`get_for_update` API获取每个键的锁并返回一个`KeyUpdater`;同一键的后续`get_for_update`调用将阻塞,直到先前的`KeyUpdater`被丢弃。

let (updater, current_value) = topic.get_for_update("hello").await.unwrap();
let new_value = expensive_computation(current_value).await;
updater.write(new_value, Duration::from_secs(60)).unwrap();

基准测试

这些结果是在苹果M1处理器上运行`benches/cache_benchmark.rs`得到的。

  • mt(4):在4个线程上运行相同任务时的每线程操作延迟。
lookup - cache size 10000
                        time:   [1.5978 us 1.6051 us 1.6130 us]
lookup mt(4) - cache size 10000
                        time:   [9.7801 us 9.8464 us 9.9329 us]
insert - cache size 10000
                        time:   [4.6316 us 4.6785 us 4.7169 us]
insert mt(4) - cache size 10000
                        time:   [21.195 us 21.420 us 21.614 us]

依赖项

~23MB
~441K SLoC