我正在关注此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>
在这种情况下你会建议什么?
答案 0 :(得分:2)
排序集是您要排序的内容的理想数据结构,但正如您所指出的,集合的成员是字符串。既然如此,您有两种可能的选择:
序列化:您可以实现自己的或使用现成的东西(例如JSON)在集合的每个成员中存储多个元素。
让您的成员<#39; contents是其他键的名称,并将您的对象存储在这些引用的键中 - HASH数据类型看起来很符合您的需求。