将mget与redis-rs一起使用时,参数数量错误

时间:2016-06-23 15:06:32

标签: redis rust

我正在尝试使用Rust访问Redis,其中包含以下内容:

extern crate redis;

use redis::{Client, Commands, Connection, RedisResult};

fn main() {

    let redis_client = Client::open("redis://127.0.0.1/").unwrap();
    let redis_conn = redis_client.get_connection().unwrap();

    let mut keys_to_get = vec![];
    keys_to_get.push("random_key_1".to_string());
    keys_to_get.push("random_key_2".to_string());
    let redis_result: String = redis_conn.get(keys_to_get).unwrap();
}

当我运行cargo run时,我得到:

     Running `target/debug/test_resdis`
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: An error was signalled by the server: wrong number of arguments for 'get' command', ../src/libcore/result.rs:746
note: Run with `RUST_BACKTRACE=1` for a backtrace.
error: Process didn't exit successfully: `target/debug/test_resdis` (exit code: 101)

我做错了什么,还是个错误?

1 个答案:

答案 0 :(得分:1)

针对netcat服务器运行程序会显示以下请求:

*3
$3
GET
$12
random_key_1
$12
random_key_2

GET命令应为MGET

我认为这是bug in the implementation

impl<T: ToRedisArgs> ToRedisArgs for Vec<T> {
    fn to_redis_args(&self) -> Vec<Vec<u8>> {
        ToRedisArgs::make_arg_vec(self)
    }
}

impl<'a, T: ToRedisArgs> ToRedisArgs for &'a [T] {
    fn to_redis_args(&self) -> Vec<Vec<u8>> {
        ToRedisArgs::make_arg_vec(*self)
    }

    fn is_single_arg(&self) -> bool {
        ToRedisArgs::is_single_vec_arg(*self)
    }
}

在幕后,图书馆使用ToRedisArgs::is_single_arg检查密钥类型,以确定其是否为多值,其默认实现为true

如您所见,切片实现了ToRedisArgs::is_single_arg,但Vec却没有。这也表明了一种解决方法:将矢量视为切片:

redis_conn.get(&*keys_to_get)

This issue has now been filed with the library