#cache #lru-cache #lru #distributed

xfetch

最优概率缓存刷新算法

3 个版本 (稳定)

1.0.1 2020年7月15日
1.0.0 2019年11月16日
0.1.0 2019年6月22日

#177 in 缓存

MIT/Apache

19KB
136

xfetch-rs

Documentation Crates.io Test

关于

Rust crate,用于最优概率缓存雪崩预防算法,即XFetch算法

它可以与像LRU缓存这样的缓存容器结合使用,在多线程/多进程计算等并行环境中实现缓存过期和并行重新计算。

它非常高效,因为算法不需要进程之间的协调(无锁)。

示例

创建单个缓存条目并测试其过期

# struct SomeValue { value: u64, ttl: u64 };
# fn expensive_computation() -> SomeValue { SomeValue { value: 42, ttl: 10000 } }
use xfetch::CacheEntry;
use std::time::Duration;

let entry = CacheEntry::builder(|| {
    expensive_computation()
})
.with_ttl(|value| {
    Duration::from_millis(value.ttl)
})
.build();

assert!(!entry.is_expired());

CacheEntry 可以与任何缓存库一起使用。例如 lru crate

use lru::LruCache;
use xfetch::CacheEntry;
use std::time::Duration;

struct SomeValue {
    value: u64,
    ttl: u64
};

fn recompute_value(n: u64) -> SomeValue {
    SomeValue { value: n, ttl: 10000 }
}

fn main() {
    let mut cache = LruCache::new(2);

    cache.put("apple", CacheEntry::builder(|| recompute_value(3))
        .with_ttl(|v| Duration::from_millis(v.ttl))
        .build());
    cache.put("banana", CacheEntry::builder(|| recompute_value(2))
        .with_ttl(|v| Duration::from_millis(v.ttl))
        .build());

    if let Some(entry) = cache.get(&"apple") {
        if !entry.is_expired() {
            assert_eq!(entry.get().value, 3);
        } else {
            cache.put("apple", CacheEntry::builder(|| recompute_value(3))
                .with_ttl(|v| Duration::from_millis(v.ttl))
                .build());
        }
    }
}

显示不同系统模拟的早期过期概率的图表

Probability Plot

参考资料

许可证

许可协议为以下之一

任选其一。

贡献

除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可协议定义,均应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~520KB