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

标签 sorting caching redis

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

  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,并使用这些 id 直接从 hashmap 存储中提取

关于如何最好地解决此问题,您还有其他想法或建议吗?提前致谢。

最佳答案

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

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

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

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

  4. 冲洗并重复您需要的任何排序类型,例如“评论数量”、“按字母顺序”、“ Actor 计数”等。过滤也可以用这种方式完成,但正常的集合可能是对于这个目的来说已经足够了。

关于sorting - 在 Redis 中缓存可排序/可过滤的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16638088/

相关文章:

sorting - 如何对 Excel 列 A.T. 进行排序带有/空/空列单元格的行在顶部?

java - 是否有可能在 Caffeine 中获取候选被逐出 key 集?

php - 我如何在 controller.php 中将 redis 更改为 mysql

Firefox (Gecko) 代码 - 询问缓存 - 如何获取设备列表?

python - 如何缓存/内存我的 SQLAlchemy 函数?

c# - Redis 相对于 C# 字典的优势

键数量增加时的 Redis 性能

php - 根据父/子关系对数组值进行排序

javascript - 使用 Javascript 对 html 表格进行数字排序 - 超过 10 不起作用

java - 排序映射<Integer,List<Double>>