| English | 简体中文 |
Starshard 是一个高性能、延迟初始化分片的并发 HashMap。
它面向真实生产场景,重点解决:
已达到生产可用(v2.2.0)。
v2.2.0 已交付的 Roadmap 主能力:
Clone / Cached / Cow)及基于 epoch 的缓存失效机制。[dependencies]
starshard = { version = "2.2.0", features = ["async", "rayon", "serde", "lifecycle", "advanced"] }
# 最小依赖:
# starshard = "2.2.0"
ShardedHashMap::new(64)。AsyncShardedHashMap。SnapshotMode::Cached,再评估 SnapshotMode::Cow。try_with_*)。迁移说明:
| Feature | 能力 | 典型场景 |
|---|---|---|
async |
AsyncShardedHashMap(Tokio RwLock) |
异步服务与任务系统 |
rayon |
快照迭代并行扁平化 | 大规模扫描/导出 |
serde |
同步版序列化/反序列化 + 异步快照序列化辅助 | 持久化与数据导出 |
lifecycle |
per_shard_load、memory_stats、drain 等 |
运维观测与维护 |
advanced |
事务/CAS/复制/诊断 API | 高级并发控制与控制面 |
use starshard::ShardedHashMap;
let m: ShardedHashMap<String, i32> = ShardedHashMap::new(64);
m.insert("k1".into(), 10);
assert_eq!(m.get(&"k1".into()), Some(10));
assert_eq!(m.len(), 1);
#[cfg(feature = "async")]
#[tokio::main]
async fn main() {
use starshard::AsyncShardedHashMap;
let m: AsyncShardedHashMap<String, i32> = AsyncShardedHashMap::new(64);
m.insert("k1".into(), 10).await;
assert_eq!(m.get(&"k1".into()).await, Some(10));
}
| 目标 | 同步 API | 异步 API |
|---|---|---|
| 插入/更新 | insert(k, v) |
insert(k, v).await |
| 读取 | get(&k) |
get(&k).await |
| 删除 | remove(&k) |
remove(&k).await |
| 批量插入 | batch_insert(items) |
batch_insert(items).await |
| 批量读取 | batch_get(&keys) |
batch_get(&keys).await |
| 条件更新 | compute_if_present(&k, f) |
compute_if_present(&k, f).await |
| 条件插入 | compute_if_absent(k, f) |
compute_if_absent(k, f).await |
| 指标/内省 | shard_stats() / memory_stats() |
shard_stats().await / memory_stats().await |
按“安全边界 + 控制度”选择:
with_shards_and_hasher(...)with_shards_and_hasher_capped(...)ShardCountError):
try_with_shards_and_hasher(...)try_with_shards_and_hasher_capped(...)with_snapshot_mode(...)with_shards_and_hasher_and_snapshot_mode(...)with_shards_and_hasher_capped_and_snapshot_mode(...)v2.2.0)use starshard::{RebalanceOptions, ShardedHashMap};
let m: ShardedHashMap<String, i32> = ShardedHashMap::new(8);
let report = m.rebalance_to(32, RebalanceOptions::default()).unwrap();
assert_eq!(report.from_shards, 8);
assert_eq!(report.to_shards, 32);
use starshard::ShardedHashMap;
let m: ShardedHashMap<String, i32> = ShardedHashMap::new(8);
m.start_rebalance_online(32).unwrap();
while m.rebalance_status().state == "migrating" {
m.advance_rebalance(2);
}
assert_eq!(m.rebalance_status().state, "idle");
语义说明:
idle。v2.2.0)SnapshotMode 支持按负载选择:
Clone:每次重建快照(默认,写路径开销最低)。Cached:无写入时复用快照缓存。Cow:分片级 COW 快照视图,适合高频快照读取。use starshard::{ShardedHashMap, SnapshotMode};
let clone_map: ShardedHashMap<String, i32> =
ShardedHashMap::with_snapshot_mode(64, SnapshotMode::Clone);
let cached_map: ShardedHashMap<String, i32> =
ShardedHashMap::with_snapshot_mode(64, SnapshotMode::Cached);
let cow_map: ShardedHashMap<String, i32> =
ShardedHashMap::with_snapshot_mode(64, SnapshotMode::Cow);
| 负载画像 | 推荐模式 |
|---|---|
| 高写入 + 低快照频率 | Clone |
| 中写入 + 中快照频率 | Cached |
| 低写入 + 高频快照读取 | Cow 或 Cached |
RwLock<HashMap<..>>,分片模型在混合负载下通常能降低竞争。rayon。Cached 与 Cow。Serialize / Deserialize。S::default()。async_snapshot_serializable().await 进行序列化。示例:
examples/v210_rebalance.rsexamples/snapshot_mode_clone_demo.rsexamples/snapshot_mode_cached_demo.rsexamples/snapshot_mode_cow_demo.rsexamples/mixed_workload_snapshot_tradeoff_demo.rs基准入口:
benches/bench_main.rs发布前或升级后建议执行:
cargo fmt --all
cargo test --all-features
cargo check --all-features
Vec<(K, V)>。RebalanceOptions 的 background、batch_size、max_pause_ns 在 v2.2.0 中为前向兼容预留参数。双许可证:
你可以任选其一。