2

我有一些数据存储在 redis 缓存中,我的应用程序将在 Rust 中读取这些数据。数据由python存储。每当我存储一个字符串或一个数组时,它都会以一种我无法读入 Rust 的奇怪形式存储它。反之亦然,我想从 Rust 编写并能够在 python 中读取它。

使用 django 外壳:

In [0]: cache.set("test","abc")
In [1]: cache.get("test")
Out[1]:'abc'

使用 redis-cli:

127.0.0.1:6379> GET :1:test
"\x80\x04\x95\a\x00\x00\x00\x00\x00\x00\x00\x8c\x03abc\x94."

生锈的输出:

Err(Invalid UTF-8)

Rust 代码使用 redis-rs 库读取数据:

    let client = redis::Client::open("redis://127.0.0.1:6379")?;
    let mut con = client.get_connection()?;
    let q:Result<String, redis::RedisError> = con.get(":1:test");
    println!("{:?}",q);

我希望能够将字符串或数组读入 Rust,因为它是用 Python 编写的,反之亦然。此外,一个键中的数据只能由 Rust 或 Python 写入,而不是两者。

这个问题不是这个问题的重复,因为它专门针对重音编码,但是,我也想解决我的数组问题。此外,django 在 redis 中为字符串设置的值不仅仅是字符串的 UTF 编码。

4

1 回答 1

2

啊,尝试跨环境扔数据的乐趣。你现在被咬的东西被称为Pickle并且是django-redis. 在这种情况下(在 python 中),序列化程序所做的是在 python 和 redis 之间转换数据,因此您可以存储它,而不管类型如何,但更重要的是,您可以使用它传入的类型来检索它。

蟒蛇的一面

显然,如果你有无限的时间和精力,你可以pickle用 rust 重写,然后你就可以阅读这种格式。我很确定您两者都没有,并且根据您存储的数据,您甚至可能不想这样做。

相反,我将建议将序列化程序从 更改picklejson. 配置中要更改的内容的描述位于https://django-redis-cache.readthedocs.io/en/latest/advanced_configuration.html#pluggable-serializers,特别是,我很确定类名你要使用的是django_redis.serializers.JSONSerializer.

这有缺点。特别是,有些对象类型将不再能够存储在 python 端,但如果你真的打算在 rust 端读取数据,这不应该让你担心。

Sven Marnach在其中一条评论中提到该serde-pickle板条箱存在。我自己没有使用过它,但它看起来确实很有希望,如果它确实有效,可能会为你节省大量的互操作工作。

生锈的一面

要阅读内容,现在每个键都将是 json,您将使用serdeor解码类型miniserde。这应该很简单;请记住,您不会从中获得本机类型;相反,您将获得serde::Value枚举的成员(BooleanNumberObject等),然后您必须对其进行过滤。

编辑您的问题以表明您要存储的内容,我很乐意在此处扩展如何执行此操作!

于 2019-09-03T14:21:40.150 回答