我有各种各样的数据缓存在标准的 Redis HashMap 中,我遇到了需要响应客户端排序和过滤请求的情况。名称、平均评级和评论数量的订单排名可以定期更改(可能一分钟多次)。谁能建议我解决这个问题的正确策略?考虑以下示例以帮助理解我在寻找什么:
- 客户端向/api/v1/cookbooks?orderBy=name&limit=20&offset=0 发出 API 请求
- 我应该回复前 20 个条目,按姓名排序
到目前为止我考虑过的策略:
- 对于每种类型的 HashMap 存储(食谱、食谱等),从 Postgres ORDER BY 为每个排序方案(字母顺序、平均评分等)创建一个排序集;然后根据limit和offset拉出ZRANGE切片
- 将排序数据直接存储到每个键的 JSON 字符串数据中。
- 使用 SELECT id FROM table ORDER BY _ 访问 postgres,并使用这些 id 直接从 hashmap 存储中提取
关于如何最好地解决此问题,您还有其他想法或建议吗?提前致谢。
最佳答案
所以,正如下面评论中提到的 Sorted Sets是在缓存中实现排序和过滤功能的好方法。以下面的示例为例,了解如何解决需要在散列中对对象进行排序的问题:
给定一个名为“movies”的散列,其方案为 bucket:objectId -> object,它是一个 JSON 字符串表示(阅读关于“存储”你的散列以提高性能的信息 here.
创建一个名为“movieRatings”的排序集,其中每个成员都是“电影”哈希中的一个 objectId,其分数是所有评级值的平均值(由数据库计算)。只需使用您要排序的任何内容的数字表示,Redis 就可以为您提供很大的灵 active ,让您可以提取所需的切片。
这个简单的方案在可以实现的方面具有很大的灵 active - 您只需向排序集询问一组符合您要求的键,然后使用 HMGET 从“电影”哈希中查找这些键。两次 Swift Redis 调用,问题解决。
冲洗并重复您需要的任何排序类型,例如“评论数量”、“按字母顺序”、“ Actor 计数”等。过滤也可以用这种方式完成,但正常的集合可能是对于这个目的来说已经足够了。
关于sorting - 在 Redis 中缓存可排序/可过滤的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16638088/