3 releases

0.1.4 Jul 29, 2024
0.1.3 Jul 4, 2022
0.1.2 Jun 16, 2022
0.1.1 Jun 16, 2022
0.1.0 Jun 16, 2022

#834 in Database interfaces

Download history 166/week @ 2024-11-15 150/week @ 2024-11-22 207/week @ 2024-11-29 221/week @ 2024-12-06 347/week @ 2024-12-13 184/week @ 2024-12-20 184/week @ 2024-12-27 243/week @ 2025-01-03 152/week @ 2025-01-10 117/week @ 2025-01-17 106/week @ 2025-01-24 115/week @ 2025-01-31 415/week @ 2025-02-07 758/week @ 2025-02-14 982/week @ 2025-02-21 885/week @ 2025-02-28

3,088 downloads per month

Apache-2.0

17KB
390 lines

sqlite-cache

crates.io

SQLite-based on-disk cache for Rust.

Usage

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");

Locked updates

This library supports locked updates to prevent the thundering herd problem on cache misses. The get_for_update API acquires a per-key lock and returns a KeyUpdater; subsequent get_for_update calls on the same key will block until the previous KeyUpdater is dropped.

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();

Benchmark

These results are from running benches/cache_benchmark.rs on an Apple M1 processor.

  • mt(4): Per-thread operation latency when running the same task on 4 threads.
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]

Dependencies

~24MB
~449K SLoC