在redis中,将对象存储在排序集中的传统方法是什么



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

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

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

但是,如果它是"自包含的",在zset之外没有或很少访问,则可以将对象序列化为选定的格式(JSON、MESSAGEPACK、KRYO…),然后将其存储为zset条目的值。这样,当你从zset中读取时,你会有更好的性能(只有一个O(log(N)+M)的查询,它实际上非常好,可能是你能得到的最好的),但如果你需要在外部读/写这个值,你可能不得不在其他zset/结构中复制这个值,这也意味着手动保持值的同步。

Redis有关于每个命令性能的良好文档,所以请检查您将编写哪些查询并计算总成本,这样您就可以很好地比较这两个选项。

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

简短回答:是的,所有内容都必须存储为字符串

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

最新更新