#cache #user-defined #key-value #criterion #numbers #pair #capacity

weight-cache

根据用户定义的标准,持有限数量的键值对的缓存

7个版本

0.2.3 2021年3月25日
0.2.2 2021年3月23日
0.1.2 2021年3月19日

1196数据结构 中排名

Download history 60/week @ 2024-03-11 60/week @ 2024-03-18 44/week @ 2024-03-25 62/week @ 2024-04-01 41/week @ 2024-04-08 37/week @ 2024-04-15 44/week @ 2024-04-22 68/week @ 2024-04-29 60/week @ 2024-05-06 60/week @ 2024-05-13 62/week @ 2024-05-20 56/week @ 2024-05-27 55/week @ 2024-06-03 52/week @ 2024-06-10 79/week @ 2024-06-17 140/week @ 2024-06-24

每月下载量 331
6 crate 中使用(2 个直接使用)

MIT/Apache

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

功能标志

许可证:MIT OR Apache-2.0

依赖项

~47–790KB
~13K SLoC