8 个版本 (4 个重大更新)

1.0.0-alpha.1 2023 年 8 月 31 日
0.4.0 2024 年 6 月 18 日
0.3.0 2024 年 2 月 13 日
0.2.2 2023 年 9 月 7 日
0.0.4 2022 年 9 月 26 日

数据库接口 中排名 #278

Download history 989/week @ 2024-05-04 943/week @ 2024-05-11 1212/week @ 2024-05-18 654/week @ 2024-05-25 923/week @ 2024-06-01 456/week @ 2024-06-08 961/week @ 2024-06-15 497/week @ 2024-06-22 570/week @ 2024-06-29 687/week @ 2024-07-06 457/week @ 2024-07-13 298/week @ 2024-07-20 339/week @ 2024-07-27 343/week @ 2024-08-03 783/week @ 2024-08-10 577/week @ 2024-08-17

每月下载量 2,082

BSD-3-Clause

29KB
546 行(不包括注释)

rslock - Rust 中的 Redis Redlock

Crates.io Docs badge

这是基于 Redis 的 Redlock 分布式锁机制的实现。

特性

  • 锁扩展
  • 异步运行时支持(async-std 和 tokio)
  • 异步 Redis

安装

cargo add rslock

[!NOTE] 此 crate 的默认功能将提供 async-std。您可以在安装时通过提供 tokio-comp 功能标志来选择使用 tokio,但 tokio 有一些限制,无法访问 API 的某些部分(了解更多信息)。

构建

cargo build --release

使用方法

use std::time::Duration;

use rslock::LockManager;

#[tokio::main]
async fn main() {
    let rl = LockManager::new(vec![
        "redis://127.0.0.1:6380/",
        "redis://127.0.0.1:6381/",
        "redis://127.0.0.1:6382/",
    ]);

    let lock;
    loop {
        // Create the lock
        if let Ok(l) = rl
            .lock("mutex".as_bytes(), Duration::from_millis(1000))
            .await
        {
            lock = l;
            break;
        }
    }

    // Extend the lock
    match rl.extend(&lock, Duration::from_millis(1000)).await {
        Ok(_) => println!("lock extended!"),
        Err(_) => println!("lock couldn't be extended"),
    }

    // Unlock the lock
    rl.unlock(&lock).await;
}

扩展锁

扩展锁实际上是在刷新其持续时间,而不是向其添加额外时间。例如,如果一个 1000ms 的锁在 500ms 后扩展了 1000ms,它将总共持续 1500ms,而不是 2000ms。这种方法与 Node.js Redlock 实现 保持一致。请参阅 扩展脚本

测试

使用以下命令运行测试

cargo test

贡献

如果您发现错误或想以其他方式帮助,请 提交问题

许可证

BSD。请参阅 LICENSE

依赖关系

~6–21MB
~268K SLoC