Whirlwind:Rust 异步并发哈希表
概述
Whirlwind 是一个为高性能并发数据访问设计的、基于分片(sharded)的异步哈希表库,专为 Rust 语言开发。它无缝集成 Rust 的 async/await 语法,适用于多线程环境,能有效减少锁竞争。目前该库仍在开发中,1.0 版本之前可能会有破坏性更新。
核心特性
- 异步支持:与 Rust 的 async/await 语法无缝集成。
- 高性能:通过分片(sharding)机制最小化并发环境下的锁竞争。
- 线程安全:可跨多线程安全使用,无需担心数据竞争。
- 熟悉的 API:提供类似标准 HashMap 的接口,易于上手。
- 可定制分片数:允许根据工作负载配置分片数量,以优化性能。
安装与使用
通过 Cargo.toml 添加依赖:
[dependencies]
whirlwind = "0.1.1"
基本用法示例
use whirlwind::ShardMap;
#[tokio::main]
async fn main() {
let map = ShardMap::new();
map.insert("apple", 3).await;
map.insert("banana", 5).await;
if let Some(quantity) = map.get(&"apple").await {
println!("We have {} apples!", quantity);
}
map.remove(&"banana").await;
}
并发操作示例
支持通过异步任务并发插入数据,并确保数据一致性:
use whirlwind::ShardMap;
use tokio::task::JoinSet;
#[tokio::main]
async fn main() {
let map = ShardMap::new();
let tasks: JoinSet<_> = (0..1000).map(|i| {
let map = map.clone();
tokio::spawn(async move {
map.insert(i, i * 2).await;
})
}).collect();
tasks.join_all().await.ok();
assert_eq!(map.len().await, 1000);
}
自定义分片数
可初始化时指定分片数量(如 64 个):
let map = ShardMap::with_shards(64);
性能测试
在 Apple M3 Max 设备上进行了基准测试,使用 std hasher 和 ahash 两种哈希函数,覆盖了以下场景:
- 读取密集型(Read Heavy)
- 读写交换型(Exchange)
- 快速增长型(Rapid Grow)
测试结果表明该库在并发环境下具有高性能表现。
贡献与许可
项目欢迎贡献,需遵循标准的 GitHub 工作流程(fork、分支、提交、PR)。代码风格使用 rustfmt 格式化。
该库基于 Apache License 2.0 许可发布。