redis怎么存数组和获取数组?

老实说,我尝试了几种访问 Redis 中数组的方法,每种方法都有自己的陷阱和优点。

比如直接使用字符串存储。
我之前有一个PHP项目,使用Serialize将数组打包成一个长字符串,然后扔到Redis中。
取出时将其反序列化。
这种方式的优点是可以跨语言使用,Python和Java都可以无缝使用。
但缺点也很明显。
字符串本身没有结构。
如果想要获取数组中的第三个元素,就需要自己解析位置,有点费力。
后来我改用 JSON,因为它读起来更直观。
至少调试时不用担心serialize的乱码问题。

哈希结构也经常被推荐。
我尝试使用 Redis Hash 来存储一维数组,例如B. 学生信息,学生号作为字段,姓名和成绩作为值。
通过HGETALL你可以获取所有学生信息,非常方便。
然而,存储二维数组很复杂。
我挣扎了很长时间,最后发现必须将二维数组折叠成键名或者使用嵌套哈希,这比直接存储字符串更复杂。
有一个存储产品类别的案例,有很多级别。
最终,在hash中使用hash解决了问题,但是维护起来非常繁琐。

另一种选择是使用 List 模拟二维数组。
我有一个朋友创建了一个游戏排行榜,使用玩家 ID 作为索引,将玩家数据作为存储在列表中的值。
这特别适合维度固定、顺序固定的场景。
如果你想存储不规则的多维数组,这是一个坏主意。

最简单粗暴的方式就是直接序列化多维数组。
我曾经有一个数据结构非常复杂的后端系统。
最后直接转成JSON字符串存储到Redis中。
取出来反序列化成一个对象。
虽然速度慢一些,但是省去了你的后顾之忧。
但有一个教训:保存时序列化,检索时反序列化。
这两个进程必须加锁,否则并行太多就会造成数据混乱。

事实上,方法的选择取决于所涉及的公司。
如果数组元素是结构化数据,则哈希可能更合适。
如果只是普通的列表,最简单的方式就是直接存储字符串。
我遇到过的最大的坑就是没有考虑性能,用hash来存储几万条记录的数组。
HGETALL 每次都慢得要命。
后来通过使用分片存储解决了这个问题。

我自己没有这样做过,但我听说Redis 6 开始支持JSON数据类型,并且存储数组可能会更方便。
我记得日期是 X 左右,但我建议你检查一下。

Numpy数组和列表list的区别

Numpy 数组比列表快 1 0 倍以上。
列表存储不同类型的数据,Numpy 必须是同一类型。
List Pruning 很慢,Numpy Pruning 很快。
Numpy 可以流式传输,而列表则不能。
使用 Numpy 计算 1 00 万个平方的总和,对于 list 需要 3 秒,对于 Numpy 需要 0.3 秒。
你自己掂量一下吧。

【串讲总结】array, list, tensor,Dataframe,Series之间互相转换总结

等等,还有一件事,我上次做项目的时候遇到了一件奇怪的事情。
显然是将数组转换为张量,但模型报告了一个错误,指出尺寸错误。
查了一下,原来是我忘记用reshape来调整形状了。
这提醒我,转换时不能只顾类型,形状也必须正确。
这个转换看似简单,但实际上涉及到很多技巧。

【串讲总结】array, list, tensor,Dataframe,Series之间互相转换总结

数据类型转换对于深度学习至关重要。
首先,让我解释一下要点。
DataFrame 是二维表,Series 是一维表。
数组是多维列表,张量用于深度学习。
转换步骤如下:
1 .将 DataFrame 更改为 Series 并选择列索引。
2 .更改系列直接列出并转移。
3 . 将列表转换为数组并使用numpy。
4 .从数组到Tensor再到torch的转换。
5 . 张量变成数组,反之亦然。
6 . Tensor 改为 list,torch 改为 list。
7 . 将数组直接转换为列表。
8 . 将列表转换为 Tensor,然后转换为 torch。
9 . 如有必要,将数组或列表转换为系列。

在实际操作中,我们会慢慢探索。