Rust 缓存结构和简单的函数记忆化
cached 提供了几种缓存结构的实现,以及用于定义备忘函数的宏。直接使用存储类型时,首先使用 use cached::prelude::*;。简短的方法名(get/set/len/…)都位于通用扩展特性上,而 prelude 通过一次导入将每个特性都带入(见下面的方法命名部分)。
需要 Rust >= 1.92。 (在 1.92 之前,async_core/async 特性无法编译:CachedGetOrSetAsync 默认实体遇到了借用限制,rustc 属性已被标记为 Rust-lang/Rust#100013。Rust-version 是一个单个 crate 级别的值,因此最低版本适用于每个特性集。)
使用#[cached]/#[once]宏定义的备存函数是线程安全的,其后端函数缓存被封装在一个互斥锁/读写锁中。#[concurrent_cached]函数通过存储自身的内部同步来实现线程安全:分片存储使用每个分片的parking_lot::RwLock;Redis和磁盘存储依赖于各自服务器/文件系统的并发机制。默认情况下,#[cached]不使用写同步:对于相同的键,并发的未备存调用可能会各自独立计算并覆盖彼此,与 2.x 行为和 Python 的functools.lru_cache相匹配。将sync_writes = "by_key"设置为对相同键的并发首次调用进行去重,通过按键分组的锁。将sync_writes = true(或"default")设置为在每次未命中期间保持整个缓存锁。注意:"by_key"在整个函数体中保持按键分组锁,因此不应用于递归或重入备存函数(当活动调用链中的键共享一个分组时存在死锁风险)。#[once]默认为不进行同步(添加sync_writes = true以序列化并发首次调用);#[concurrent_cached]不支持sync_writes。对于"by_key"的每个键锁分组的数量可以通过sync_writes_buckets = N(默认 64)进行调整。
暂无开放 Issues,或尚未同步最近议题。