6

我在标准 Redis 哈希图中缓存了各种数据,并且遇到了需要响应客户端请求以进行排序和过滤的情况。姓名、平均评分和评论数量的订单排名可以定期更改(可能每分钟多次)。谁能建议我解决这个问题的正确策略?考虑以下示例以帮助理解我在寻找什么:

  1. 客户端向 /api/v1/cookbooks?orderBy=name&limit=20&offset=0 发出 API 请求
  2. 我应该回复前 20 个条目,按名称排序

到目前为止我考虑过的策略:

  • 对于每种类型的 hashmap 存储(食谱、食谱等),从 Postgres ORDER BY 中为每个排序方案(字母顺序、平均评分等)创建一个排序集;然后根据limit和offset拉出ZRANGE切片
  • 将排序数据直接存储到每个键的 JSON 字符串数据中。
  • 使用 SELECT id FROM table ORDER BY _命中 postgres ,并使用 ids 直接从 hashmap 存储中提取

有关如何最好地解决此问题的任何其他想法或建议?提前致谢。

4

2 回答 2

1

因此,正如下面评论中提到的,Sorted Sets是在缓存中实现排序和过滤功能的好方法。以以下示例为例,了解如何解决需要在哈希中对对象进行排序的问题:

  1. 给定一个名为“movies”的散列,其方案为 bucket:objectId -> object,它是一个 JSON 字符串表示形式(在此处阅读有关“存储”散列以提高性能的信息。

  2. 创建一个名为“movieRatings”的排序集,其中每个成员都是来自“电影”哈希的 objectId,其分数是所有评分值的平均值(由数据库计算)。只需使用数字表示您尝试排序的任何内容,Redis 就可以在如何提取所需切片方面为您提供很大的灵活性。

  3. 这个简单的方案在可以实现什么方面具有很大的灵活性 - 您只需向排序集询问一组符合您要求的键,然后使用 HMGET 从您的“电影”哈希中查找这些键。两个快速的 Redis 调用,问题解决了。

  4. 冲洗并重复您需要的任何类型的排序,例如“评论数量”、“按字母顺序”、“演员数量”等。过滤也可以以这种方式完成,但正常的集合可能就足够了。

于 2013-05-22T03:03:18.410 回答
0

这取决于您的需求。你的每一个策略都可以奏效。

  • 如果您有一个非常大的散列和/或您经常运行您的订单查询,那么您为每种您想要订购的方式存储一个辅助排序集的第一种方法是最好的方法。如果您的散列很大,这种方法将需要大量内存,但随着您的散列变大并且您开始更频繁地运行订单查询,它在时间复杂度方面也将很好地扩展。另一方面,它在您的数据结构中引入了复杂性,感觉就像您正在尝试将 Redis 用于 Postgres、MySQL 或 Mongo 等典型 DB 更擅长的事情。

  • 将订购数据直接存储到您的密钥中意味着您每次执行订单查询时都需要提取整个哈希。如果您的哈希非常小,或者您不经常进行有序查询,那么这可能还不错,但这根本不会扩展。

  • 如果您已经在使用 Postgres 来获取密钥,为什么不将值也存储在 Postgres 中。这比点击 Postgres 然后点击 Redis 便宜得多,并且你的代码依赖的东西更少。IMO,这可能是您最好的选择,并且最自然地工作。这样做,除非你有很好的理由不在 Postgres 中存储值,或者有一些非常大的速度问题,在这种情况下,请使用你的第一个策略。

于 2013-05-20T00:55:12.427 回答