Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在redis中从python和rust存储和读取公共数据?_Python_Django_Redis_Rust_Django Redis - Fatal编程技术网

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

如何在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

我有一些数据存储在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."
生锈的输出:

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中使用它。如果您遇到问题,请告诉我,我可能可以进一步帮助您:-)