我在Rust的Redis中尝试接收各种数据类型
为了什么
Rust中的Redis库可以很好地进行类型转换。但是需要注意的是,最近引入的流式类型具有复杂的形式。
程式
一个简单的例子
它会将query方法的返回值转换为绑定的类型。
[package]
name = "redis_test"
version = "0.1.0"
edition = "2018"
[dependencies]
r2d2_redis = "^0.12"
use std::error::Error;
use std::ops::DerefMut;
type RedisConn = r2d2_redis::r2d2::PooledConnection<r2d2_redis::RedisConnectionManager>;
fn get_conn() -> Result<RedisConn, Box<dyn Error>>{
let manager = r2d2_redis::RedisConnectionManager::new("redis://localhost:6379")?;
let pool = r2d2_redis::r2d2::Pool::builder().max_size(2).build(manager)?;
Ok(pool.get()?)
}
fn main() -> Result<(), Box<dyn Error>>{
let mut conn = get_conn()?;
r2d2_redis::redis::cmd("SET").arg("aaa").arg("1").query(conn.deref_mut())?;
let res: String = r2d2_redis::redis::cmd("GET").arg("aaa").query(conn.deref_mut())?;
println!("{:?}", res);
let res: i64 = r2d2_redis::redis::cmd("GET").arg("aaa").query(conn.deref_mut())?;
println!("{:?}", res);
}
"1"
1
管道
通过使用管道,您可以获取多个值。
fn main() -> Result<(), Box<dyn Error>>{
let mut conn = get_conn()?;
r2d2_redis::redis::pipe()
.cmd("DEL").arg("aaa")
.cmd("SET").arg("aaa").arg("1")
.cmd("DEL").arg("bbb")
.cmd("SET").arg("bbb").arg("2")
.query(conn.deref_mut())?;
let res: (String, i64) = r2d2_redis::redis::pipe()
.cmd("GET").arg("aaa")
.cmd("GET").arg("bbb")
.query(conn.deref_mut())?;
println!("{:?}", res);
}
("1", 1)
名单
您还可以通过遍历数组来添加参数。
fn main() -> Result<(), Box<dyn Error>>{
let mut conn = get_conn()?;
let args = vec![1,2,3];
let mut pipe = r2d2_redis::redis::pipe();
let cmd = pipe
.cmd("DEL").arg("aaa")
.cmd("RPUSH").arg("aaa");
for i in args.iter() {
cmd.arg(*i);
}
cmd.query(conn.deref_mut())?;
let list: Vec<i64> = r2d2_redis::redis::cmd("LRANGE")
.arg("aaa").arg(0).arg(-1).query(conn.deref_mut())?;
println!("{:?}", list);
}
[1, 2, 3]
哈希
可以将其转换为HashMap。
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn Error>>{
let mut conn = get_conn()?;
r2d2_redis::redis::pipe()
.cmd("DEL").arg("aaa")
.cmd("HSET").arg("aaa").arg("a").arg("1")
.cmd("HSET").arg("aaa").arg("b").arg("2")
.query(conn.deref_mut())?;
let res: HashMap<String, String> = r2d2_redis::redis::cmd("HGETALL")
.arg("aaa").query(conn.deref_mut())?;
println!("{:?}", res);
}
{"a": "1", "b": "2"}
直播
好像看起來 Vec 有重複,但如果不這樣做,就無法正確地獲取。
fn main() -> Result<(), Box<dyn Error>>{
let mut conn = get_conn()?;
r2d2_redis::redis::pipe()
.cmd("DEL").arg("aaa")
.cmd("DEL").arg("bbb")
.cmd("XADD").arg("aaa").arg("*").arg("a").arg("1").arg("b").arg("2")
.cmd("XADD").arg("bbb").arg("*").arg("c").arg("1").arg("d").arg("2")
.cmd("XADD").arg("aaa").arg("*").arg("a").arg("3").arg("b").arg("4")
.cmd("XADD").arg("bbb").arg("*").arg("c").arg("3").arg("d").arg("4")
.query(conn.deref_mut())?;
let res: Vec<Vec<(String, Vec<Vec<(String, HashMap<String, String>)>>)>> = r2d2_redis::redis::cmd("XREAD")
.arg("COUNT").arg("2").arg("STREAMS").arg("aaa").arg("bbb").arg("0").arg("0").query(conn.deref_mut())?;
println!("{:?}", res);
}
[
[("aaa", [[("1574640845410-0", {"a": "1", "b": "2"})], [("1574640845410-1", {"a": "3", "b": "4"})]])],
[("bbb", [[("1574640845410-0", {"d": "2", "c": "1"})], [("1574640845410-1", {"c": "3", "d": "4"})]])]
]