Rust redis查询返回nil报类型不兼容错误,如何正确处理空值?
问题根源
你当前的get_str函数直接尝试将redis返回的原始值转为String类型,当目标key不存在、redis返回Nil时,FromRedisValue::from_redis_value会直接抛出类型不匹配错误,导致get_str返回Err。你调用unwrap时会直接panic,根本无法进入后续的空值判断逻辑。
你之前尝试将redis::Value::Nil和String对比的写法类型不匹配,也是因为get_str的Ok分支只有类型转换成功的String值,不可能出现redis::Value类型的结果。
最优解决方案
修改get_str的返回值为Result<Option<String>>,主动识别redis返回的Nil场景,转换为Rust标准的Option空值语义处理:
1. 修改redis_util.rs中的get_str实现
pub async fn get_str(con: &mut Connection, key: &str) -> Result<Option<String>> { let value = con.get(key).map_err(RedisCMDError)?; // 先判断是否是redis返回的nil if value == redis::Value::Nil { return Ok(None); } // 非nil的场景再尝试转String FromRedisValue::from_redis_value(&value) .map(|val| Some(val)) .map_err(|e| RedisTypeError(e).into()) }
2. 修改main.rs中的调用逻辑
不需要再用unwrap强行取结果,用模式匹配处理所有分支即可:
#[tokio::main] async fn main() { const REDIS_CON_STRING: &str = "redis://default:password@cruise-redis-headless.reddwarf-cache.svc.cluster.local:6379/3"; let redis_client = redis::Client::open(REDIS_CON_STRING).expect("can create redis client"); let mut redis_conn = get_con(redis_client).expect("can get redis connection"); let cached_playlist = get_str(&mut redis_conn, "dd").await; match cached_playlist { // redis返回nil,对应key不存在 Ok(None) => print!("d"), // key存在但值为空字符串 Ok(Some(s)) if s.is_empty() => print!("empty string"), // 正常拿到非空值 Ok(Some(s)) => println!("get value: {}", s), // 其他错误(连接错误、命令执行错误等) Err(e) => eprintln!("query error: {}", e), } }
不改工具函数的临时方案
如果你不想修改redis_util.rs的实现,也可以在上层对错误类型做判断,识别nil对应的类型错误,但这种方案不如上面的方案优雅,错误匹配逻辑和redis crate的错误提示强绑定:
match cached_playlist { Ok(s) if s.is_empty() => print!("empty string"), Ok(s) => println!("get value: {}", s), Err(Error::DirectError(DirectError::RedisTypeError(e))) if e.to_string().contains("response was nil") => print!("d"), Err(e) => eprintln!("error: {}", e), }
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

