如何在redis中从python和rust存储和读取公共数据?
我有一些数据存储在redis缓存中,我的应用程序将在Rust中读取这些数据。数据由python存储。每当我存储字符串或数组时,它都以一种我无法读入Rust的奇怪形式存储它。反之亦然,我想从Rust编写并能够用python阅读它 使用django shell:如何在redis中从python和rust存储和读取公共数据?,python,django,redis,rust,django-redis,Python,Django,Redis,Rust,Django Redis,我有一些数据存储在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 "\x8
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)
使用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);
let client=redis::client::open(“redis://127.0.0.1:6379")?;
让mut con=client.get_connection()?;
设q:Result=con.get(“:1:test”);
普林顿!(“{:?}”,q);
我希望能够像用Python编写的那样将字符串或数组读入Rust,反之亦然。
而且,一个键中的数据只能由Rust或Python编写,而不能同时由两者编写
这个问题不是特别针对重音编码的as的重复,但是,我也想解决数组的问题。此外,django在redis中为字符串设置的值不仅仅是字符串的UTF编码。啊,尝试跨环境抛出数据的乐趣。你现在被咬的东西被调用,是
django redis
的默认序列化程序。在本例中(在python中),序列化程序所做的是在python和redis之间转换数据,这样您就可以存储它,而不管它是什么类型,但更重要的是,您可以使用它所属的类型检索它
python方面
显然,如果你有无限的时间和精力,你可以用rust重写pickle
,然后你就可以阅读这种格式。我敢肯定你两个都没有,而且根据你存储的数据,你甚至可能不想这样做
相反,我建议将序列化程序从pickle
更改为json
。配置中要更改的内容的描述位于,特别是,我非常确定您要使用的类名是django\u redis.serializers.JSONSerializer
这是有缺点的。特别是,有些对象类型将不再能够存储在python端,但是如果您真的打算在rust端读取数据,这不应该引起您的关注
其中一条评论中提到板条箱存在。我自己并没有使用过它,但它看起来确实很有希望,如果它能正常工作,可能会为您节省大量的互操作工作
生锈的一面
要阅读这些内容,现在每个键都将是json,您将使用或来解码类型。这应该相当简单;请记住,您不会从中获得本地类型;相反,您将获得serde::Value
枚举的成员(Boolean
,Number
,对象
,等等),然后必须对其进行筛选
编辑您的问题,以表明您正在尝试存储什么,我将很高兴在这里详细介绍如何执行此操作 它可能的重复比这更复杂,老实说,这更像是一个
django redis
问题,而不是一个rust
问题,因为罪魁祸首是django为了能够存储变量类型而在幕后进行的数据序列化。为什么不使用json呢?@geckos django默认使用pickle。我将尝试使用JSON序列化程序,正如Sébastien Renauld在回复中提到的那样。我并不是真正提倡使用Python pickle格式实现Python和Rust之间的互操作性,但如果您愿意,您可以使用–无需花费不合理的时间。我不知道存在这种情况!将其添加到回答中谢谢。我将尝试使用JSON序列化程序添加一个具有相同redis位置的缓存,并在python和rust中使用它。如果您遇到问题,请告诉我,我可能可以进一步帮助您:-)