2013-05-13 687 views
1

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

+0

你可以管理你的redis读/写吗?这似乎是基准测试的合适情况。 – sberry 2013-05-13 16:41:59

+0

是的,我可以管道读/写 – 2013-05-13 16:51:37

+0

“更好”取决于你的形象模式。一次读取或更新一行或一列是否有意义?你会一直保存/阅读整个表吗?你正在优化传输速度吗?序列化速度?存储大小? – Triptych 2013-05-13 17:27:25

回答

3

在设计应用程序时,我遇到了同样的问题。我选择了简单的一面。我将假设你的2d数据数组表示一个数据库行。我会JSON编码并使用SET进行存储。这允许我在使用一个redis命令处理多个对象时使用MGETMSET。如果这个数据在我的数据库中得到更新,我的密钥是DEL。对我来说,这比尝试更新redis散列更容易。

redis中的哈希值有其优点。由于redis使用“ziplist”编码,它们通常会占用较少的内存。您也可以避免序列化,这对于某些应用程序可能非常重要。

下面是一个用于我的散列的示例用例。假设我想要查看给定用户名的用户名。我会做HGET user.usernames 1234。这会给我用户名为1234的用户名。如果没有,我会查询数据库并设置它,并且因为数据永远不会改变,所以我永远不会过期哈希。它允许快速查找常见的数据,而不是拉动整个用户,反序列化并返回所需的字段。

对于一个预期的大量查找表,我使用这里提出的算法:http://redis.io/topics/memory-optimization 它使用多个散列,好像有一个哈希,并利用ziplist编码来节省内存。

无论您选择哪种方法,只需保持一致。

+0

感谢您使用redis文档的链接,它让我意识到我可以使用'SETRANGE'和'GETRANGE'命令来执行我需要的功能。我需要存储的2D数组仅包含0到9之间的数字,因此我可以存储唯一的字符串,并将我的数组的行连接起来。这种方法非常快。 – 2013-05-16 07:55:03

1

如何使用Redis lists?不支持列表列表,但可以为每个列表条目存储一行,或者构建引用其他列表的键列表。

1

您可以将每个元素存储在自己的键中。只需要命名键名,以便名称包含元素的索引,也可以是数组的维数。