我在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"})]])]
]