Rust中将Redis返回值反序列化为自定义类型的问题求解
解决方案
方案1:serde-redis 正确实现
错误原因
你代码的核心问题是调用逻辑顺序颠倒:
redis::cmd::query方法要求返回类型实现FromRedisValuetrait,你的自定义Task没有实现这个 trait,直接指定query::<Task>必然报错deserialize是serde_redis给redis::Value类型实现的方法,你强行让query返回Task后,自然找不到这个方法
修复步骤
- 首先确认Cargo.toml依赖配置正确:
[dependencies] redis = "0.23" serde = { version = "1.0", features = ["derive"] } serde-redis = "0.14"
- 调整查询逻辑,先获取原生的
redis::Value再反序列化:
use serde_redis::RedisDeserialize; use redis::{Connection, Value}; pub fn execute_task(conn: &mut Connection) { // 第一步先查询得到Redis原生Value类型 let raw_val: Value = redis::cmd("LPOP") .arg("task_q") .query(conn) .unwrap(); // 第二步对Value做反序列化得到Task let task: Task = raw_val.deserialize().unwrap(); println!("... executing task {} ...", task.id); }
注:存入数据时也要用serde_redis::RedisSerialize的serialize方法把Task转成Value再写入,保证序列化/反序列化格式对齐
方案2:手动实现FromRedisValue 正确实现
错误原因
redis::Value是redis库定义的枚举类型,用于统一表示Redis协议返回的所有数据类型(字符串、数字、数组、哈希等),它本身没有你自定义Task的id、desc字段,你需要先把Value解析为对应格式的中间类型,再组装成Task。
修复步骤
这里默认你是将Task以Redis哈希(HSET)格式存储,实现代码如下:
use redis::{FromRedisValue, Value, RedisResult, ErrorKind}; use std::collections::HashMap; impl FromRedisValue for Task { fn from_redis_value(v: &Value) -> RedisResult<Self> { // 先把Redis返回的Value转成哈希形式的HashMap let hash_map: HashMap<String, Value> = FromRedisValue::from_redis_value(v)?; // 分别取出id和desc字段,做类型转换 let id = u32::from_redis_value( hash_map.get("id").ok_or((ErrorKind::TypeError, "missing field id"))? )?; let desc = String::from_redis_value( hash_map.get("desc").ok_or((ErrorKind::TypeError, "missing field desc"))? )?; Ok(Task { id, desc }) } // 不需要手动实现from_redis_values,默认实现会自动调用from_redis_value批量转换 }
实现完成后你可以直接用query::<Task>获取结果,不需要额外的反序列化步骤:
pub fn execute_task(conn: &mut Connection) { let task: Task = redis::cmd("LPOP") .arg("task_q") .query(conn) .unwrap(); println!("... executing task {} ...", task.id); }
内容的提问来源于stack exchange,提问作者ilmoi
相关产品推荐
相关产品推荐

