0

我正在编写一个使用 Redis 的非常简单的社交网络应用程序。

每个用户都有一个排序集,其中包含他们提要中项目的 ID。如果我想显示他们的提要,我会执行以下步骤:

  1. 用于ZREVRANGE获取提要中项目的 ID
  2. 用于HMGET获取提要(每个提要项都是一个字符串)

但是现在,我还想知道用户是否喜欢某个提要项。因此,我有一个与每个提要项目相关联的集合,其中包含喜欢提要项目的用户 ID。

如果我得到 15 个提要项,现在我必须对 Redis 执行额外的 15 个请求以找出当前用户是否评论过每个提要项(通过检查每个提要的每个集合中是否存在 id)。

所以这将需要 15+1 个请求。

使用 Redis 时,这种类型的查询是否被视为“正常”?有没有更好的方法可以构建数据以避免这么多请求?

我正在使用 redis-rb gem。

4

2 回答 2

0

这种数据库(Non-relational database),你必须在多个请求之间做出权衡,并包含一些数据冗余。

您应该分别分析每种情况并考虑一些方面,例如:

  1. 访问这些数据的频率如何?
  2. 这种冗余将消耗多少空间?
  3. 为了获得所有数据而没有冗余,我必须执行多少个请求?
  4. 性能是个问题?

在您的情况下,我建议为每个用户保留一个 Set/Hash 或只是一个 JSON 编码数据,其中包含所有最近用户交互的历史记录,例如评论、喜欢等。每次用户访问提要时,您只需要阅读提要和历史;只有两个请求。

需要记住的一件事是,每次用户交互时,您还必须更新所有冗余数据。

于 2013-06-24T14:45:07.153 回答
0

您可以使用管道(redis-rb 支持)轻松重构代码以将 15 个请求合二为一。

您使用第一个请求从排序集中获取 id,然后使用它们根据这些结果获取所需的许多键(使用管道)

使用这种方法,您应该总共有 2 个请求而不是 16 个请求,并保持您的代码非常简单。

作为替代方案,您可以使用 lua 脚本并在一个请求中获取所有内容。

于 2013-06-24T14:39:32.193 回答