use deadpool_redis::Pool;
use redis::AsyncCommands;
use crate::error::StreamResult;
pub async fn try_acquire_dedup_lock(
pool: &Pool,
key: &str,
ttl_secs: u64,
) -> StreamResult<bool> {
let mut conn = pool.get().await?;
let result: Option<String> = redis::cmd("SET")
.arg(key)
.arg("1")
.arg("NX")
.arg("EX")
.arg(ttl_secs)
.query_async(&mut *conn)
.await?;
Ok(result.is_some())
}
pub async fn release_dedup_lock(pool: &Pool, key: &str) -> StreamResult<()> {
let mut conn = pool.get().await?;
let _: () = conn.del(key).await?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dedup_functions_exist() {
fn _assert_acquire<'a>(_pool: &'a Pool, _key: &'a str, _ttl: u64) -> impl std::future::Future<Output = StreamResult<bool>> + 'a {
try_acquire_dedup_lock(_pool, _key, _ttl)
}
fn _assert_release<'a>(_pool: &'a Pool, _key: &'a str) -> impl std::future::Future<Output = StreamResult<()>> + 'a {
release_dedup_lock(_pool, _key)
}
}
}