我使用以下代码接收redis流数据:
pub fn consume(){
let redis_client = redis::Client::open("redis://default:[email protected]:6379/1").expect("get redis client failed");
let mut con = redis_client
.get_connection()
.expect("get redis connection failed");
let stream_name = "texhub-server:proj:s-comp-queue";
let stream_id = "0";
loop {
let result = con.xread(&[stream_name], &[stream_id]);
if let Err(e) = result.as_ref() {
println!("{}", e);
return;
}
let unwarp: Vec<(String, String)> = result.unwrap();
}
}
当解析redis流响应时,总是显示错误:
Response was of incompatible type - TypeError: "Bulk response of wrong dimension" (response was [bulk(string-data('"texhub-server:proj:s-comp-queue"'), bulk(bulk(string-data('"1693881638829-0"'), bulk(string-data('"name"'), string-data('"test"'))), bulk(string-data('"1693881702534-0"'), bulk(string-data('"name"'), string-data('"test"'))), bulk(string-data('"1693891547874-0"'), bulk(string-data('"c98f73bc869143d084eb38a0fc38a8e7"'), string-data('""'))), bulk(string-data('"1693892469370-0"'), bulk(string-data('"c98f73bc869143d084eb38a0fc38a8e7"'), string-data('""'))), bulk(string-data('"1693892476263-0"'), bulk(string-data('"c98f73bc869143d084eb38a0fc38a8e7"'), string-data('""'))), bulk(string-data('"1693899506942-0"'), bulk(string-data('"c98f73bc869143d084eb38a0fc38a8e7"'), string-data('""')))))])
我试着调整Vec<(String, Vec<(String, String)>)>
的响应仍然不匹配的响应。我应该做什么来解析流响应?流数据看起来像这样:
1条答案
按热度按时间axr492tv1#
看到缩进的结构可能有助于理解:
XREAD
文档中演示的CLI输出也显示了这一点。在顶层有一个元素数组,其中每个元素都有一个键(即流名称)和值(即,流内容)。流内容中的每个元素都有一个键(例如,
1693881638829-0
),然后是数据(例如,{"name":"test"}
)。因此,您至少缺少一个嵌套级别。如果你想要快速的方法,这应该是可行的:
尽管您可能希望顶层是一个类似于map的结构,并且如果传递的数据不像示例数据显示的那样简单,则可能需要与
(String, String)
不同的数据类型。