1 个不稳定版本

0.2.0 2019年12月29日

#1159并发

MIT 许可证

17KB
199 代码行

macgyver-lock

Build Status

该库实现了在此处描述的ghetto锁这里。此锁不能抵抗服务器故障,应仅在不需要强锁定保证的情况下使用。

此锁的常见用途是避免由缓存未命中引起的冲浪者问题

使用方法

将以下内容添加到您的 Cargo.toml

macgyver-lock = "0.1.0"

示例

use macgyver_lock::{LockOptions, LockError};
use memcache::Client;
use std::borrow::Cow;

fn expensive_computation() -> u64 {
    2 * 2
}

fn main() {
    let mut client = Client::connect("memcache://127.0.0.1:11211").expect("error creating client");
    let mut lock = LockOptions::new(Cow::Borrowed("db-lock"), Cow::Borrowed("owner-1"))
                    .with_expiry(1)
                    .build()
                    .expect("failed to build client");
    let value = client.get("key").expect("failed to get key");
    let v = if value.is_none() {
        lock.try_acquire()
            .and_then(|_guard| {
                // compute and update cache for other instances to consume
                let v = expensive_computation();
                client.set("key", v, 5).expect("failed to set key");
                Ok(v)
            })
            .or_else(|_| loop {
                // poll cache key until it is updated.
                let v = client.get("key").expect("failed to get key");
                if v.is_none() {
                    continue;
                }
                break Ok::<_, LockError>(v.unwrap());
            }).unwrap()
    } else { value.unwrap() };
    assert_eq!(4, v);
}

依赖项

~3.5MB
~99K SLoC