7个版本
0.2.3 | 2021年3月25日 |
---|---|
0.2.2 | 2021年3月23日 |
0.1.2 | 2021年3月19日 |
1196 在 数据结构 中排名
每月下载量 331
在 6 个 crate 中使用(2 个直接使用)
20KB
342 行
weight-cache
一个持有有限数量的键值对的缓存。当缓存容量超出时,最不经常使用(“使用”表示查找或将键值对放入缓存)的键值对将被自动移除。
与lru-cache crate(本crate深受其启发!)不同,容量不是缓存中的项目数量,而是可以通过为值类型 V 实现 Weighable
来由任意标准给出。一个直接的例子是使用对象分配的大小,并提供一个缓存不应超过的总容量。
示例
use weight_cache::{Weighable, WeightCache};
use std::num::NonZeroUsize;
#[derive(PartialEq, Debug)]
enum Food {
Milk { milliliters: usize },
Cucumber { pieces: usize },
Meat { grams: usize },
Potato { pieces: usize },
Crab { grams: usize },
}
impl Weighable for Food {
fn measure(value: &Self) -> usize {
match value {
Food::Milk { milliliters } => milliliters * 104 / 100,
Food::Cucumber { pieces } => pieces * 158,
Food::Meat { grams } => *grams,
Food::Potato { pieces } => pieces * 175,
Food::Crab { grams } => *grams,
}
}
}
let mut cache = WeightCache::new(NonZeroUsize::new(500).unwrap());
// Can't put too much in!
assert!(cache.put(0, Food::Meat { grams: 600 }).is_err());
assert!(cache.is_empty());
cache.put(1, Food::Milk { milliliters: 100 }).unwrap();
assert!(!cache.is_empty());
assert_eq!(*cache.get(&1).unwrap(), Food::Milk { milliliters: 100 });
cache.put(2, Food::Crab { grams: 300 }).unwrap();
assert_eq!(*cache.get(&2).unwrap(), Food::Crab { grams: 300 });
assert_eq!(*cache.get(&1).unwrap(), Food::Milk { milliliters: 100 });
cache.put(3, Food::Potato { pieces: 2 }).unwrap();
assert_eq!(*cache.get(&3).unwrap(), Food::Potato { pieces: 2});
assert!(cache.get(&2).is_none()); // 1 has been touched last
assert_eq!(*cache.get(&1).unwrap(), Food::Milk { milliliters: 100 });
功能标志
metrics
:启用缓存上的度量收集。使用prometheus::Registry
调用WeightCache::register
注册;使用WeightCache::new_with_namespace
设置自定义的度量命名空间
许可证:MIT OR Apache-2.0
依赖项
~47–790KB
~13K SLoC