我正在编写一个使用Redis的非常简单的社交网络应用程序。
每个用户都有一个排序集,其中包含其Feed中的ID项。如果我想显示其Feed,请执行以下步骤:
ZREVRANGE
获取Feed中的商品ID HMGET
获取Feed(每个Feed项都是一个字符串)但是现在,我还想知道用户是否喜欢过饲料项目。所以我有一个与每个Feed项相关联的集合,其中包含喜欢Feed项的用户ID。
如果我收到了15个Feed项,那么现在我必须向Redis执行额外的15个请求,以查找当前用户是否已对其进行评论的每个Feed项(通过检查每个Feed中每个集中是否存在id )。
因此需要15 + 1个请求。
此类查询是否被认为是正常的'什么时候使用Redis?有没有更好的方法来构建数据以避免这么多请求?
我正在使用redis-rb gem。
答案 0 :(得分:0)
您可以轻松地重构代码,通过使用管道(redis-rb支持)将15个请求合并为一个。
您可以使用第一个请求从排序集中获取ID,然后根据这些结果使用它们获取所需的许多键(使用管道)
使用这种方法,您应该总共有2个请求而不是16个,并且保持代码非常简单。
作为替代方案,您可以使用lua脚本并在一个请求中获取所有内容。
答案 1 :(得分:0)
这种数据库(非关系型数据库),你必须在多个请求之间进行权衡,并包括一些数据冗余。
您应该分别分析每个案例并考虑一些方面,例如:
在您的情况下,我建议为每个用户保留Set / Hash或JSON编码数据,其中包含所有近期用户交互的历史记录,例如评论,喜欢等。每次用户访问Feed时,您只需阅读饲料和历史;只有两个请求。
要注意的是,每次用户交互时,您都必须更新所有冗余数据。