Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在Redis中缓存可排序/可筛选数据_Sorting_Caching_Redis - Fatal编程技术网

Sorting 在Redis中缓存可排序/可筛选数据

Sorting 在Redis中缓存可排序/可筛选数据,sorting,caching,redis,Sorting,Caching,Redis,我在一个标准的Redis hashmap中缓存了各种各样的数据,我遇到了一种情况,需要响应客户端的排序和过滤请求。姓名、平均评分和评论数量的排名可以定期更改(可能一分钟更改多次)。有人能给我一个解决这个问题的正确策略吗?请考虑下面的例子来帮助理解我在寻找什么: 客户端向/API/v1/cookbooks发出API请求?orderBy=name&limit=20&offset=0 我应该以前20个条目作为回应,按名称排序 到目前为止,我考虑的策略是: 对于每种类型的hashmap存储(烹饪书、食

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

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

    • 对于每种类型的hashmap存储(烹饪书、食谱等),根据Postgres ORDER BY为每个订购方案(字母顺序、平均评级等)创建一个排序集;然后根据限制和偏移量拉出ZRANGE切片
    • 将排序数据直接存储到每个键的JSON字符串数据中
    • 通过\从表ORDER中使用SELECT id点击postgres,并使用id直接从hashmap存储区中提取

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

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

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

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

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


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

  • 给定一个名为“movies”的散列,其模式为bucket:objectId->object,这是一个JSON字符串表示(请阅读“bucketing”您的散列以获得性能)

  • 创建一个名为“movieRatings”的排序集,其中每个成员都是“movies”散列中的objectId,其分数是所有评级值的平均值(由数据库计算)。只需使用试图排序的任何内容的数字表示,Redis就可以灵活地提取所需的切片

  • 这个简单的方案在可以实现的方面有很大的灵活性-您只需向您的排序集请求一组符合您需求的密钥,然后使用HMGET从“电影”散列中查找这些密钥。两次swift Redis调用,问题就解决了

  • 冲洗并重复您需要的任何类型的排序,如“评论数量”、“字母顺序”、“演员数量”等。也可以通过这种方式进行过滤,但正常设置可能足以实现这一目的


  • 我同意这一点。看起来OP尝试使用ReDIS,在这里关系数据库更适合。我不一定要使用ReDIS作为RMCDMS。我只是尽量减少数据库访问量。@ PATRKIN我知道它很难听,而且你知道你的情况比我们其他人好,但是认真考虑一下费用是否是A。第二,在这里继续使用Redis的复杂性超过了废弃Redis和单独使用Postgres。我不太了解你的情况,不知道这对你来说是否正确,但如果Redis实际上增加了复杂性和/或损害了你的性能,请不要让你在Redis上投资的沉没成本让你走上一条非最优的道路你的情况。为了澄清,我不想在Redis中进行任何排序计算。我想对Postgres进行一次排序/平均计算,并将它们存储在缓存中。这是缓存的一个常见用例,我尝试做的唯一额外的一点是使用这些来自Postgres的缓存计算,并生成我需要的键->秩关系可用于在内存中执行快速排序操作。在更详细地查看Redis sorted set API后,我认为使用我考虑的第一个方案可以相对轻松地实现这一点。如果它确实如我所怀疑的那样工作,我将返回,并将我所做的作为正确的答案发布。您的答案是误导性的,Redis带有过滤功能d一起排序是不好的,举一个简单的例子来说明:给我一类电影,按名称排序,偏移量x,限制y。如果名称是一个排序集(仅用于高效排序大容量的结构)然后限制和偏移将包括不属于类别1的电影,因为这是一个不同的集或排序集。即使没有限制和偏移,按分数查询排序集的结果也不是redis集,因此您无法有效地进行进一步的相交。但是,如果您只需对结果进行排序或筛选(而不是同时进行排序),则效果很好.Pierre,其中一些交集需要在应用程序代码中完成-true。获取按名称排序的id列表(在您的语言使用的任何类似数组的结构中)