4 releases
0.1.3 | Feb 17, 2022 |
---|---|
0.1.2 | Jan 20, 2022 |
0.1.1 | Jan 18, 2022 |
0.1.0 | Jan 18, 2022 |
#1750 in Database interfaces
16KB
215 lines
redis_utils
Cohesive helpers built on top of redis-rs for:
- async transactions
get
ing andset
ing json values
Async Transactions
A macro that helps you set up a safe async redis transaction.
Takes:
- A connection
- The name of a pipeline which it configures in atomic-mode.
- A set of keys to
WATCH
- The body of the transaction that can get those keys, use the pipeline (for side effects) and if those keys change (and
the
EXEC
component of the atomic pipeline fails), then the body will be re-executed. - Allows for safe early returns (aborted transactions) with typed values, all keys will be un-watched during an early return.
tx!(&mut con, pipe, &["key1"], {
let mut value: u8 = con.get("key1").await?;
value = value + 1;
Ok(pipe.set("key1", value))
});
Aborting a tx
tx!(&mut con, pipe, &["key1"], {
let mut value: u8 = con.get("key1").await?;
value = value + 1;
if value == 69 {
return Err(Abort(BadNumberFound));
}
Ok(pipe.set("key1", value))
});
Handling return values
let tx: Result<u8, TxError<NumberError> > = tx!(&mut con, pipe, &["key1"], {
let mut value: u8 = con.get("key1").await?;
value = value + 1;
if value == 69 {
return Err(Abort(BadNumberFound));
}
Ok(pipe.set("key1", value))
});
- The
Ok(T)
oftx
is the type that's handed topipe.set()
forredis-rs
's type inference. TxError
allows you to return any type inTxError::Abort
for custom type handling.- If the transaction fails due to an underlying
redis
error orserde
tx
will reflect this in the associatedTxError::DbError
orTxError::Serialization
.
JSON helpers
Using the helpers from TODO allow you to turn this:
let json_string: String = con.get(key).await?;
let value: Type = serde_json::from_str(&json_string).unwrap;
let value: Type = con.json_get(key).await.unwrap();
Dependencies
~6–16MB
~191K SLoC