使用redis crate访问不同的Redis数据库时出错:无效的数据库编号。

4
我正在尝试使用版本为0.3.1的redis创建来访问Redis,但是出现了无效数据库的错误提示。
extern crate redis;

use redis::*;
use std::string::String;
use std::collections::HashSet;

fn main() {
   if let Err(e) = read_meta_keys_redis("myset".to_string()) {
     println!("{}", e.description());
   }
 }

fn read_meta_keys_redis(key: String) -> redis::RedisResult<()> {
  println!("22{}", key);
  let client = try!(redis::Client::open("redis://127.0.0.1:6379/2"));

  let con = try!(client.get_connection());
  let mems: HashSet<i32> = try!(con.smembers(key));
  for x in mems.iter() {
      println!("op-->{}", x);
  }
  Ok(())
}

我的本地redis:在Shell上执行以下命令 redis-cli select 2 sadd myset "hello" sadd myset "how are you"

127.0.0.1:6379[2]> smembers myset 
  1) "hello" 2) "how are you" 
127.0.0.1:6379[2]>

在我之前的问题“访问Redis时静默错误”中,可以找到一些背景。


你是否检查过细节是否正确,服务器是否正在运行,连接细节是否符合预期格式等等?目前这里的信息远远不足。 - Chris Morgan
@ChrisMorgan:我已经编辑了问题并发布了详细信息。 - harry
我认为@ChrisMorgan是在询问您确保命令行使用和代码之间的连接信息相同。具体来说,似乎您选择的数据库(/2)可能不正确。请[编辑]您的问题以包括您如何调用redis-cli命令。 - Shepmaster
@Shepmaster,我已经编辑了问题,使其更加清晰。127.0.0.1:6379 [2]> 这不是表示cli已连接到DB 2上的redis吗? - harry
1个回答

2
错误来自于 箱子里面
path => path.parse::<i64>().unwrap_or(
    fail!((ErrorKind::InvalidClientConfig, "Invalid database number"))),

不幸的是,这只是一个编程错误。unwrap_or 总是 对参数进行评估,而在这种情况下,参数是fail!宏。看起来应该使用unwrap_or_else,它接受仅在失败情况下运行的闭包。
我已经提交了PR以解决此问题。作为解决方法,您可以直接创建一个redis::ConnectionInfo结构并在其中指定数据库。

我已经使用本地库的副本,并进行了PR所做的更改,然后重新运行了应用程序。现在我能够跨过最初的障碍,但现在我遇到了“响应类型不兼容”的错误,原因是“None”。你有什么想法我错过了什么吗? - harry
@harry 并不是这样;这似乎是另一个问题 :-) 我唯一的猜测是你的命令行显示字符串,但你却使用了 HashSet<i32> - Shepmaster
显然我是个愚蠢的程序员 :(。我怎么会忽略那么明显的问题呢...是的,那就是根本原因。非常感谢。 - harry
我还有一个问题:通过创建 redis::ConnectionInfo 结构体的第二种方法,我得到了这个错误信息:结构体 redis::client::Client 的字段 connection_info 是私有的,这是预期的。在 Rust 中是否有可能动态更改字段的可见性? - harry
显然我是个愚蠢的程序员 - 哎呀,我们都必须在某个时候学习东西 ^_^。在Rust中有可能动态更改字段的可见性吗? - 不行,那会规避可见性修饰符的原因。也许这应该是一个单独的错误报告给箱子维护者? - Shepmaster
可能创建者从未预料到,使用库的人会直接从调用代码中实例化connection_info。我猜测这是因为作者在整合解析逻辑时所付出的努力。无论如何,非常感谢! - harry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接