如何从 python 和 rust 存储和读取 redis 中的公共数据?

How to store and read common data in redis from python and rust?

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

中读取它

使用 Django shell:

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."

Rust 的输出:

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 写入,而不能同时由两者写入。

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

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

python那边

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

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

这有缺点。特别是,有些对象类型将无法再存储在 python 端,但如果您确实打算在 Rust 端读取数据,这不应该让您担心。

Sven Marnach mentioned in one of the comments that the serde-pickle 箱子存在。我自己没有使用过它,但它看起来确实很有前途,如果它确实起作用,可能会为您节省大量的互操作工作。

生锈的一面

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

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