#lru-cache #hash-map #hook #prune #element #evicting

no-std evicting_cache_map

支持修剪钩子的驱逐LRU缓存

2个不稳定版本

0.4.0 2023年11月12日
0.3.1 2023年11月10日

#1963 in 数据结构

Download history 12/week @ 2024-03-27 26/week @ 2024-04-03 2/week @ 2024-05-15 57/week @ 2024-05-22 115/week @ 2024-05-29 188/week @ 2024-06-05 97/week @ 2024-06-12 208/week @ 2024-06-19 219/week @ 2024-06-26

736每月下载量

BSD-2-Clause

115KB
2.5K SLoC

EvictingCacheMap

驱逐缓存映射

此包提供了一种EvictingCacheMap的no_std实现,类似于HashMap,但它有一个最大容量,并移除最不常使用的元素以维持它。

使此缓存映射与众不同的地方在于注册了一个在元素删除时运行的闭包。此API设计借鉴了Meta的Folly,并旨在比简单地删除值的实现更加灵活。

变更日志

详细信息

此包由ordered_hash_map提供支持,它本身由hashbrown支持,以利用经过充分测试且快速的HashMap。EvictingCacheMap是ordered_hash_map的一个轻量级包装,强制执行最大大小,在重新插入时提升元素,并在删除元素时调用闭包。

用法

将驱逐元素发送到通道。接收者可以在不同的线程中,例如。

fn main() {
    let (tx, rx) = mpsc::channel();
    let mut cachemap: EvictingCacheMap<String, u8, 10, _> =
        EvictingCacheMap::with_prune_hook(move |k, v| tx.send((k, v)).unwrap());
    let send = thread::spawn(move || {
        for x in 0..20 {
            cachemap.insert(x.to_string(), x)
        }
    });

    let recv = thread::spawn(move || {
        while let Ok((k, v)) = rx.recv() {
            println!("{k}:{v}")
        }
    });

    let _ = send.join();
    let _ = recv.join();
}

依赖关系

~1.5MB
~24K SLoC