Redis将多个项目添加到排序集

时间:2014-06-05 08:55:05

标签: redis

我正在关注此Redis教程http://redis.io/topics/twitter-clone

在页面的最后他们说

  

注意:如果帖子列表开始,则LRANGE效率不高   非常大,我们想要访问中间的元素   列表,因为Redis列表由链表支持。如果是系统   设计用于百万件物品的深度分页,最好是   而是采用分类集。

这是我最大的担忧,因为我们正在设计一个能够处理数百万甚至数十亿邮政的系统,我们估计一个项目将在20-30%的时间内在列表中间进行搜索Web应用程序正在运行。

虽然排序集存在问题..您可以添加如下所示的排序集,并考虑到它是第一个(1)帖子

zadd zset 1 "We are happy to announce a new member in our team"

但是如果我们还需要添加内容字段呢?

zadd zset 1 "We are happy to announce a new member in our team" "Please welcome James Sullivan, our new member team! He had..."

这是你得到的错误

(error) ERR syntax error

除了奇怪的事实,您必须访问post[0]post[1]而不是post['title']post['content']这样的字段(理论上,我还没有尝试过)它还有这个事实,我们现在无法克服。

实际上post对象的结构是这样的,它应该在O(1)时间内找到,即使在百万个帖子对象的中间也是如此

+-----------+
+- 1 <- ID -+
+-----------+
+------------------------+
+- title "the title..." -+
+----------------------------+
+- content "the content..." -+
+-----------------------------+
+- tags "1st tag, 2nd tag.." -+
+-----------------------+
+- author "the_author" -+
+-------------------------+
+- date "unix_timestamp" -+
+-------------------------+

如果排序集是正确的数据结构,我会感到茫然,如果不是,那么应该使用什么(集合,排序集,列表,哈希......)。 / p>

在这种情况下你会建议什么?

1 个答案:

答案 0 :(得分:2)

排序集是您要排序的内容的理想数据结构,但正如您所指出的,集合的成员是字符串。既然如此,您有两种可能的选择:

  1. 序列化:您可以实现自己的或使用现成的东西(例如JSON)在集合的每个成员中存储多个元素。

  2. 让您的成员<#39; contents是其他键的名称,并将您的对象存储在这些引用的键中 - HASH数据类型看起来很符合您的需求。