redis 响应的类型不兼容- TypeError:“批量响应的维度错误”

yiytaume  于 2023-10-15  发布在  Redis
关注(0)|答案(1)|浏览(113)

我使用以下代码接收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)>)>的响应仍然不匹配的响应。我应该做什么来解析流响应?流数据看起来像这样:

axr492tv

axr492tv1#

看到缩进的结构可能有助于理解:

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('""')
                )
            )
        )
    )
]

XREAD文档中演示的CLI输出也显示了这一点。
在顶层有一个元素数组,其中每个元素都有一个键(即流名称)和值(即,流内容)。流内容中的每个元素都有一个键(例如,1693881638829-0),然后是数据(例如,{"name":"test"})。
因此,您至少缺少一个嵌套级别。如果你想要快速的方法,这应该是可行的:

Vec<(String, Vec<(String, (String, String))>)>

尽管您可能希望顶层是一个类似于map的结构,并且如果传递的数据不像示例数据显示的那样简单,则可能需要与(String, String)不同的数据类型。

相关问题