在Redis中存储一个二维数组

4

我有一个二维数组要存储在Redis中,我看到有两种解决方案:将其存储为JSON字符串或每行存储一个哈希。哪种方式更好?


您可以将 Redis 读写流程进行管线化吗?这似乎是一个适合进行基准测试的情况。 - sberry
是的,我可以将读取/写入进行流水线处理。 - Elie Génard
1
“更好”取决于您的使用模式。一次读取或更新一行或一列是否有意义?您是否总是一次保存/读取整个表格?您是否优化传输速度?序列化速度?存储大小? - Kenan Banks
看起来哈希方法更好,因为当你必须更新数组时,你必须解析JSON字符串,这需要很多时间。 - Elie Génard
数组将被完整读取,但值将逐个更新。 - Elie Génard
请注意,所有 Redis 集合式对象的访问时间都是线性的,与它们的大小成正比。对于小列表,最好只使用列表并为每个值存储一行,但对于较大的对象,访问时间将占主导地位,您可能最好将整个对象存储在 JSON/Pickle 字符串中。这是您必须为应用程序进行基准测试的类型... - Nisan.H
3个回答

4
在设计应用程序时,我遇到了同样的问题。我选择了简单性。我假设您的二维数据数组表示数据库行。我会对其进行JSON编码并使用SET存储它。这使我能够在处理多个对象时使用MGETMSET一个redis命令。如果我的数据库中的数据更新了,我会DEL键。对我来说,这比尝试更新redis哈希表更容易。
Redis中的哈希表有其优点。由于redis使用“ziplist”编码,它们通常占用更少的内存。您还可以避免序列化,这对某些应用程序可能非常重要。
以下是我使用哈希表的示例用例。假设我想查找给定用户ID的用户名。我将执行HGET user.usernames 1234。这将为我提供用户ID 1234的用户名。如果没有匹配项,我将查询数据库并设置它,由于该数据永远不会更改,因此我永远不会过期哈希表。它允许快速查找常见数据而不是拉取整个用户,反序列化并返回所需字段。
对于潜在的大量查找表,我使用此处提出的算法:http://redis.io/topics/memory-optimization。它将多个哈希表视为一个,并利用ziplist编码来节省内存。
无论您选择哪种方法,只需保持一致即可。

感谢提供 Redis 文档的链接,它让我意识到我可以使用 SETRANGEGETRANGE 命令来实现我需要的功能。我需要存储的二维数组只包含 0 到 9 之间的数字,因此我可以将数组的行连接起来存储为一个唯一的字符串。这种方式非常快速高效。 - Elie Génard

1

使用Redis列表怎么样?虽然不支持列表嵌套,但你可以将每行作为一个列表条目存储,或者构建一个引用其他列表键的键列表。


1
您可以将每个元素存储在自己的键中。只需命名键,使名称包含元素的索引,以及数组的维度即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接