栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Redis按范围过滤,排序并先返回10

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis按范围过滤,排序并先返回10

您描述的用例无法在NoSQL解决方案中完美建模。这不是Redis的限制。

让我解释一下。您正在一个字段上运行范围查询,而在另一个字段上进行排序。这不是NoSQL解决方案擅长的。例如,Google App
Engine禁止此类查询。查看GAE查询限制,并阅读“不等式过滤器中的属性必须在其他排序顺序之前进行排序”部分

为了获得与不等式过滤器匹配的所有结果,查询将在索引表中扫描第一条匹配的行,然后返回所有连续的结果,直到找到不匹配的行。为了使连续的行代表完整的结果集,必须先通过不等式过滤器对行进行排序,然后再进行其他排序。

话虽如此,您仍然可以有效地运行查询,但是解决方案并不完美。

  1. 创建薪资范围-0-5000、5000-10000、10000-15000等
  2. 创建类似的集
    users_with_salary:10000-15000
    。该集合将包含工资在给定范围内的用户ID。
  3. 同样,创建诸如`users_with_rating:1-2“之类的集合。该集合将包含评分在给定范围内的用户ID
  4. 现在,运行以下伪代码
    String userids[];    for(rating = 10; rating > 0; rating--) {      for(salary = min_salary; salary < max_salary; salary += 5000) {          String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);          String rating_key = "users_with_rating:" + rating + "-" + (rating+1);          userids.append(redis.sinter(salary_key, rating_key));          if(userids.length > 10) {  break;          }       }    }

使用redis 2.6和lua脚本,您甚至可以在lua服务器上运行它。

总之,如果要对数据运行复杂的查询,则最好在关系数据库中对其进行建模。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371645.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号