#![cfg(feature = "bloom")]
use redis::bloom::{BloomFilterDumpChunk, BloomFilterDumpIterator};
use redis::{Connection, RedisResult, TypedCommands};
const KEY: &str = "example_bloom_1";
fn add_elements(con: &mut Connection) -> RedisResult<()> {
println!("Adding some elements to {KEY} ...");
con.bf_add(KEY, "foo")?;
con.bf_madd(KEY, &["bar", "baz"])?;
Ok(())
}
fn check_membership(con: &mut Connection) -> RedisResult<()> {
println!("Checking containment ...");
for candidate in &["foo", "bar", "baz", "quux"] {
let exists = con.bf_exists(KEY, candidate)?;
println!("* {candidate}: {exists}");
}
Ok(())
}
fn dump(con: &mut Connection) -> Vec<BloomFilterDumpChunk> {
println!("Dumping {KEY} ...");
BloomFilterDumpIterator::new(con, KEY)
.map(|r| r.expect("dump should succeed"))
.collect::<Vec<_>>()
}
fn load(con: &mut Connection, dump: Vec<BloomFilterDumpChunk>) -> RedisResult<()> {
println!("Loading dump into {KEY} ...");
for chunk in dump {
con.bf_loadchunk(KEY, chunk)?;
}
Ok(())
}
fn cleanup(con: &mut Connection) -> RedisResult<()> {
println!("Deleting {KEY} ...");
let deleted_count = con.del(KEY)?;
println!("Deleted {deleted_count} key");
Ok(())
}
fn main() -> RedisResult<()> {
let client = redis::Client::open("redis://127.0.0.1/")?;
let mut con = client.get_connection()?;
add_elements(&mut con)?;
check_membership(&mut con)?;
let dump = dump(&mut con);
cleanup(&mut con)?;
load(&mut con, dump)?;
check_membership(&mut con)?;
cleanup(&mut con)?;
Ok(())
}