在Redis中缓存可排序/可过滤的数据

pat*_*ckn 6 sorting caching redis

我有一些我已经在标准Redis hashmap中缓存的数据,而且我遇到了需要响应客户端订购和过滤请求的情况.名称,平均评分和评论数量的订单排名可以定期更改(可能每分钟多次).任何人都可以建议我采取适当的策略来攻击这个问题吗?请考虑以下示例以帮助理解我正在寻找的内容:

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

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

  • 对于每种类型的hashmap存储(cookbook,食谱等),从Postgres ORDER BY为每个排序方案(字母,平均评级等)创建排序集; 然后根据限制和偏移量拉出ZRANGE切片
  • 将排序数据直接存储到每个密钥的JSON字符串数据中.
  • 使用SELECT id FROM表ORDER BY _命中postgres ,并使用id直接从hashmap存储中提取

关于如何最好地解决这个问题的任何其他想法或建议?提前致谢.

pat*_*ckn 2

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

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

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

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

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

  • 获取按名称排序的 id 列表将导致您从 Redis 传输整个键集,然后将所有键传回以与类别集相交,然后在代码中执行限制和偏移。你从redis中真正得到了什么?对其进行基准测试,仅在不使用 Redis 的情况下在应用程序代码中执行此操作。我已经在 Redis Lua 脚本中实现了这一点,但对于大容量来说它仍然很糟糕。你的回答听起来好像过滤和排序相结合在 Redis 中很好(支持),因为它迫使你从中检索整个集合。Redis 对于其他场景来说是传奇...... (2认同)
  • 对于您的场景,如果您没有大量数据,它可能不会慢。你理想想要的是缓存 ORM 中的功能,大多数成熟的功能都支持它,例如 hibernate (java) 或 activerecord (ruby/rails),不确定它是否在 django 中可用。或者,您可以将此表分片到另一个数据库中,这看起来就像您试图从 Redis 获取的一样。 (2认同)
  • 这个答案很好地解释了为什么它不好:http://stackoverflow.com/questions/10205635/redis-filter-by-range-sort-and-return-10-first (2认同)