2013-06-24 78 views
0

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

每个用户都有一个排序的集合,其中包含其Feed中的项目的ID。如果我想显示他们的饲料,我做以下步骤:

  1. 使用ZREVRANGE获得项目的id的饲料
  2. 使用HMGET获得饲料(每源项目是一个字符串)

但现在,我也想知道用户是否喜欢饲料项目。所以我有一组与每个包含喜欢饲料项目的用户的ID的饲料项目相关联。

如果我得到15个供稿项目,现在我必须向Redis另外执行15个请求,以便查找每个供稿项目(如果当前用户已对其进行了评论)(通过检查每个组中是否存在每个供稿饲料)。

这样就需要15 + 1个请求。

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

我正在使用redis-rb gem。

+0

流水线也许?或一个Lua脚本? – akonsu

回答

0

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

你从有序集合的ID与第一个请求,然后使用它们(使用管道)

用这种方法得到你需要根据这些结果的许多键,你应该在2个请求总数而不是16,并保持你的代码非常简单。

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

0

这种数据库(非关系数据库),你必须在多个请求之间进行权衡并包含一些数据冗余。

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

  1. 如何频繁这个数据将被访问?
  2. 这个冗余将消耗多少空间?
  3. 为了获得所有数据,我将不得不做多少次请求,而不是冗余?
  4. 性能是一个问题?

在你的情况下,我会建议为每个用户保留一个Set/Hash或者只是一个JSON编码数据,并带有所有最近用户交互的历史记录,比如注释,喜欢等等。每次用户访问您只需阅读Feed和历史记录;只有两个请求。

有一点需要记住,每个用户交互,您都必须更新所有冗余数据。