在redis中将对象存储在有序集合中的常规方法是什么?

时间:2013-12-09 22:01:06

标签: redis

在redis中实现有序集的最方便/最快捷的方法是什么,其中值是对象,而不仅仅是字符串。

我应该只将对象id存储在有序集合中,然后通过其键单独查询它们中的每一个,还是有一种方法可以将它们直接存储在有序集合中,即值必须是字符串吗?

2 个答案:

答案 0 :(得分:6)

这取决于您的需求,如果您需要与其他zsets /结构共享此数据并且希望每次更改只写一次值,您可以将id作为zset值并添加哈希来存储对象。但是,它意味着当您从zset读取数据时进行额外查询(zset中的n个值为zrange + n hgetall),但是在许多结构之间编写和同步值很便宜(仅更新与该值对应的散列)。

但是如果它是“自包含的”,在zset之外没有或几乎没有访问,你可以序列化为你选择的格式(JSON,MESSAGEPACK,KRYO ......),然后将它存储为你的值zset条目。这样,当你从zset读取时,你将获得更好的性能(只有1个查询带有O(log(N)+ M),它实际上非常好,可能是你能得到的最好的),但也许你将不得不重复如果你需要在外面读/写这个值,那么其他zsets /结构中的值,这也意味着手动保持值的同步。

Redis有关于每个命令的性能的良好文档,因此请检查您要编写的查询并计算总成本,以便您可以对这两个选项进行良好比较。

另外,不要忘记redis带有乐观锁定,所以如果你需要悲观(例如因为争用),你必须手动和/或使用lua脚本。如果你需要大量的同步,第一个选项似乎更好(读取时性能较差,但仍然很好,写入时查询和复杂性较低),但是如果你的值不会发生很大变化而且内存空间不是问题,第二个选项将在读取时提供更好的性能(您可以在redis中复制值,例如定期同步值)。

答案 1 :(得分:1)

简短回答:是的,一切都必须存储为字符串

更长的答案:您可以将对象序列化为您选择的任何基于文本的格式。大多数人选择MsgPack或JSON,因为它非常紧凑,并且几乎所有语言都可以使用序列化程序。