12 个版本
0.0.10 | 2024 年 8 月 6 日 |
---|---|
0.0.9 | 2024 年 8 月 1 日 |
0.0.4 | 2024 年 7 月 31 日 |
#66 在 缓存
1,210 每月下载量
在 encrypt_config 中使用
24KB
358 行
导入
[dependencies]
rom_cache = { version = "0.0.10" }
关于项目
一个 Rust 包,用于在内存中缓存 ROM,类似于 CPU 缓存 RAM。
提供了 Cacheable
特性,以便用户定义如何 加载
和 存储
数据在二级存储中。
Cache
是本包的主要入口点,它由 CacheGroup
组成。而 CacheGroup
由 CacheLine
组成。
Cache::get::<T>()
和 Cache::get_mut::<T>()
提供从缓存和存储中检索数据。使用 LRU 选择用于 T
的 CacheLine
。
- get
- 缓存命中:返回
CacheRef
- 缓存忙碌:返回
CacheError::Busy
,LRU 选择CacheLine
正在被写入或读取,因此无法替换。 - 缓存锁定:返回
CacheError::Locked
,在写入时无法读取T
。
- get_mut
- 缓存命中:返回
CacheMut
,并解引用CacheMut
将设置CacheLine
为脏。 - 缓存忙碌:返回
CacheError::Busy
,无法替换正在使用的 LRU 选择CacheLine
。 - 缓存锁定:返回
CacheError::Locked
,在读取或写入时无法写入T
。
任何脏的 CacheLine(缓存行)将在被驱逐或 Cache
丢弃时写回二级存储(Cacheable::store()
)。
特性
nightly
:启用#![feature(trait_upcasting)]
以简化Cacheable
特性。(需要 Nightly Rust)
(返回顶部)
构建工具
- Rust
- Miri(测试)
- Loom(并发测试)
(返回顶部)
使用方法
示例
# use rom_cache::Cache;
// e.g 2-way set associative cache (8 sets/groups)
let cache: Cache<8, 2> = Default::default();
cache.get::<isize>().unwrap();
cache.get::<String>().unwrap();
{
let mut s = cache.get_mut::<String>().unwrap();
cache.get::<u64>().unwrap();
cache.get::<usize>().unwrap();
*s = "".to_string(); // set dirty
}
{
let s = cache.get::<String>().unwrap(); // other threads may evict `String` and it's stored,
// this will load it back
assert_eq!(*s, ""); // The `load` result is `""`
}
(返回顶部)
变更日志
待办事项
(返回顶部)
路线图
- 允许并发访问
- 获取时自动加载
- 基准测试
贡献
贡献使得开源社区成为一个学习、灵感和创作的绝佳场所。您做出的任何贡献都将被高度赞赏。
如果您有改进此项目的建议,请fork仓库并创建一个pull request。您也可以简单地打开一个带有“enhancement”标签的问题。别忘了为项目点个star!再次感谢!
- fork项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m '添加一些AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开pull request
(返回顶部)
许可证
在MIT许可证下分发。更多信息请参阅LICENSE.txt
(返回顶部)
联系方式
路易斯 - [email protected]
项目链接:https://github.com/kingwingfly/rom-cache
(返回顶部)
依赖项
~0.3–25MB
~350K SLoC