3 个版本 (稳定)
1.0.1 | 2020年7月15日 |
---|---|
1.0.0 | 2019年11月16日 |
0.1.0 | 2019年6月22日 |
#177 in 缓存
19KB
136 行
xfetch-rs
关于
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());
}
}
}
显示不同系统模拟的早期过期概率的图表
参考资料
- 维基百科 缓存雪崩.
- Vattani, A.; Chierichetti, F.; Lowenstein, K. (2015), 最优概率缓存雪崩预防 (PDF), 8 (8), VLDB, pp. 886–897, ISSN 2150-8097.
- Jim Nelson,互联网档案馆,RedisConf17 - 使用Redis和XFetch预防缓存雪崩.
许可证
许可协议为以下之一
- Apache License,版本 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可协议定义,均应按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~520KB