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

时间:2013-05-19 18:33:42

标签: sorting caching redis

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

  1. 客户端向/ api / v1 / cookbooks发出API请求?orderBy = name& limit = 20& offset = 0
  2. 我应该回复前20个条目,按名称排序
  3. 到目前为止我考虑过的策略:

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 给定一个名为“movies”的哈希,其方案为bucket:objectId - > object,它是一个JSON字符串表示形式(阅读关于性能的“哈希”哈希here.

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

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

  4. 冲洗并重复您需要的任何类型的订单,例如“评论数量”,“按字母顺序”,“演员数量”等。过滤也可以这种方式进行,但正常的设置可能是足以达到这个目的。

答案 1 :(得分:0)

这取决于您的需求。您的每个策略都可以运作。

  • 您为每种方式存储辅助排序集的第一种方法 如果你有一个非常大的,你想订购是最好的方法 哈希和/或您经常运行您的订单查询。这种方法会 如果您的哈希值很大,则需要大量内存,但它也可以很好地扩展 在时间复杂度方面,随着哈希变大,你就开始了 更频繁地运行订单查询。另一方面,它 介绍了数据结构的复杂性,感觉就像你一样 试图将Redis用于像Postgres,MySQL那样的典型数据库 或者Mongo会更好。

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

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