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

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

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

这取决于您的需求,如果您需要与其他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中的值,例如定期同步值).

相关文章
相关标签/搜索