10 个版本
使用旧的 Rust 2015
0.3.6 | 2024 年 8 月 1 日 |
---|---|
0.3.5 | 2024 年 5 月 24 日 |
0.3.3 | 2023 年 11 月 12 日 |
0.3.2 | 2023 年 7 月 20 日 |
0.1.0 | 2016 年 11 月 27 日 |
#323 在 缓存 中
7,753 每月下载量
在 11 个存储库中使用了 (7 直接)
21KB
351 行
HashRing
这是根据一致性哈希和随机树:解决万维网热点问题的分布式缓存协议所描述的一致性哈希的最小实现。客户端可以使用 HashRing
结构在应用程序中添加一致性哈希。 HashRing
的 API 包括三个方法: add
、remove
和 get
,用于将节点添加到环形、从环形中删除节点以及获取负责提供键的节点。
示例
以下是一个示例,说明了应用程序如何使用 HashRing
来利用一致性哈希。由于 HashRing
仅公开了最小的 API,客户端可以在其之上构建其他抽象,例如虚拟节点。下面的示例展示了在 HashRing
上实现虚拟节点的一个潜在示例。
use std::net::{IpAddr, SocketAddr};
use std::str::FromStr;
use hashring::HashRing;
#[derive(Debug, Copy, Clone, Hash, PartialEq)]
struct VNode {
id: usize,
addr: SocketAddr,
}
impl VNode {
fn new(ip: &str, port: u16, id: usize) -> Self {
let addr = SocketAddr::new(IpAddr::from_str(&ip).unwrap(), port);
VNode {
id: id,
addr: addr,
}
}
}
impl ToString for VNode {
fn to_string(&self) -> String {
format!("{}|{}", self.addr, self.id)
}
}
fn main() {
let mut ring: HashRing<VNode> = HashRing::new();
let mut nodes = vec![];
nodes.push(VNode::new("127.0.0.1", 1024, 1));
nodes.push(VNode::new("127.0.0.1", 1024, 2));
nodes.push(VNode::new("127.0.0.2", 1024, 1));
nodes.push(VNode::new("127.0.0.2", 1024, 2));
nodes.push(VNode::new("127.0.0.2", 1024, 3));
nodes.push(VNode::new("127.0.0.3", 1024, 1));
for node in nodes {
ring.add(node);
}
println!("{:?}", ring.get(&"foo"));
println!("{:?}", ring.get(&"bar"));
println!("{:?}", ring.get(&"baz"));
}
依赖项
~55KB