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

use*_*273 7 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"
Run Code Online (Sandbox Code Playgroud)

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

zadd zset 1 "We are happy to announce a new member in our team" "Please welcome James Sullivan, our new member team! He had..."
Run Code Online (Sandbox Code Playgroud)

这是你得到的错误

(error) ERR syntax error
Run Code Online (Sandbox Code Playgroud)

除了奇怪的事实,你必须访问的领域,如post[0]post[1]而不是post['title']post['content'](理论上,我还没有尝试过),也有这个事实,我们不能克服截至目前.

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

+-----------+
+- 1 <- ID -+
+-----------+
+------------------------+
+- title "the title..." -+
+----------------------------+
+- content "the content..." -+
+-----------------------------+
+- tags "1st tag, 2nd tag.." -+
+-----------------------+
+- author "the_author" -+
+-------------------------+
+- date "unix_timestamp" -+
+-------------------------+
Run Code Online (Sandbox Code Playgroud)

如果Sorted Set是正确使用的数据结构,我会感到很茫然,如果不是,那么应该使用什么(设置,排序集,列表,哈希......).

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

Ita*_*ber 3

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

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

  2. 让集合成员的内容成为其他键的名称,并将对象存储在这些引用的键中 - HASH 数据类型看起来很适合您的需求。