4 个版本
0.2.1 | 2019年12月29日 |
---|---|
0.2.0 | 2019年12月28日 |
0.1.1 | 2019年12月20日 |
0.1.0 | 2019年12月18日 |
#16 in #memcache
17KB
199 行代码(不含注释)
ghetto-lock
注意:此 crate 已迁移至 https://crates.io/crates/macgyver-lock
此库实现了在此处描述的贫民窟锁 here。该锁不抵抗服务器故障,应在不需要强锁保证的情况下使用。
此锁的一个流行用例是避免由缓存未命中引起的 stampeding herd problem。
使用方法
添加到您的 Cargo.toml
ghetto-lock = "0.2.0"
示例
use ghetto_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);
}
依赖项
~2.6–3.5MB
~89K SLoC