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缓存

Download history 2504/week @ 2024-05-02 2247/week @ 2024-05-09 1575/week @ 2024-05-16 2543/week @ 2024-05-23 1932/week @ 2024-05-30 2950/week @ 2024-06-06 2366/week @ 2024-06-13 2118/week @ 2024-06-20 2240/week @ 2024-06-27 1615/week @ 2024-07-04 2202/week @ 2024-07-11 2299/week @ 2024-07-18 1855/week @ 2024-07-25 1937/week @ 2024-08-01 2020/week @ 2024-08-08 1513/week @ 2024-08-15

7,753 每月下载量
11 个存储库中使用了 (7 直接)

MIT 许可证

21KB
351

HashRing

Build Status codecov crates.io docs.rs License

文档

这是根据一致性哈希和随机树:解决万维网热点问题的分布式缓存协议所描述的一致性哈希的最小实现。客户端可以使用 HashRing 结构在应用程序中添加一致性哈希。 HashRing 的 API 包括三个方法: addremoveget,用于将节点添加到环形、从环形中删除节点以及获取负责提供键的节点。

示例

以下是一个示例,说明了应用程序如何使用 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