当前位置: 首页 > 面试题库 >

Redis-排序集,按属性值查找项目

丁鸿云
2023-03-14
问题内容

在redis中,我将对象存储在一个排序集中。在我的解决方案中,能够按日期运行范围内的查询很重要,因此我存储的项目的得分为每个项目的时间戳,例如:

#   Score   Value
0   1443476076  {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1   1443482969  {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}

但是,在其他情况下,我需要根据其ID在集合中找到一个项目。我知道我不能像对待nosql
db那样仅查询此数据结构,但是我尝试使用ZSCAN,这是行不通的。

ZSCAN MySet 0 MATCH Id:92 count 1

它返回;“空列表或集”

也许我需要序列化不同吗?我已经使用Json.Net进行了序列化。

我如何才能做到这一点;使用日期作为分数,仍然能够通过其ID查找项目?

非常感谢,

拉尔斯

编辑:

假设这是不可能的,但是欢迎任何想法或投入:

参考:http : //openmymind.net/2011/11/8/Redis-Zero-To-Master-In-30-Minutes-
Part-1/

在Redis中,只能通过其键查询数据。即使我们使用哈希,也不能说无论田径竞赛等于sayan都给我键。

编辑2:

我试着做:

ZSCAN MySet 0 MATCH *87*

127.0.0.1:6379> ZSCAN MySet 0 MATCH *87*
1) "192"
2) 1) "{\"Id\":\"64\",\"Ref\":\"XQH4\",\"DTime\":1443837798,\"ATime\":1444187707,\"ExTime\":0,\"SPName\":\"XQH4BPGW47FM\",\"StPName\":\"XQH4BPGW47FM\"}"
   2) "1443837798"
   3) "{\"Id\":\"87\",\"Ref\":\"5CY6\",\"DTime\":1443519199,\"ATime\":1444172326,\"ExTime\":0,\"SPName\":\"5CY6DHP23RXB\",\"StPName\":\"5CY6DHP23RXB\"}"
   4) "1443519199"

不仅找到了所需的项目,而且还找到了另一个在属性ATime中出现87的项目。拥有更多唯一的,更长的ID可能会以这种方式工作,我将不得不在代码中过滤结果以找到其属性中具有确切值的ID。

仍然开放征求意见。


问题答案:

我认为这很简单。

解决方案1(劣等,不推荐)

您的方法ZSCAN MySet 0 MATCH Id:92 count 1无法解决,因为存储的字符串"{\"Id\":\"92\"...不是"{\"Id:92\"...。该字符串已更改为另一种格式。因此,尝试使用MATCH Id\":\"64或类似的东西来匹配redis中的json序列化数据。我不熟悉json.net,因此实际的字符串留给您发现。

顺便问一下,我必须问您是否确实ZSCAN MySet 0 MATCH Id:92 count 1返回了游标?我怀疑您使用ZSCAN了错误的方式。

解决方案2(更好,强烈建议)

ZSCAN当您的排序集不大并且您知道如何通过Redis的Lua事务节省网络往返时间时,它会很好。这仍然使“按ID查找”操作O(n)。因此,更好的解决方案是通过以下方式更改数据模型:

更改来自的排序集

#   Score   Value
0   1443476076 {"Id":"92","Ref":"7ADT","DTime":1443476076,"ATime":1443901554,"ExTime":0,"SPName":"7ADT33CFSAU6","StPName":"7ADT33CFSAU6"}
1   1443482969 {"Id":"11","Ref":"DAJT","DTime":1443482969,"ATime":1443901326,"ExTime":0,"SPName":"DAJTJTT4T02O","StPName":"DAJTJTT4T02O"}

#   Score   Value
0   1443476076 Id:92
1   1443482969 Id:11

将其余的详细数据移动到另一组哈希类型键中:

#   Key   field-value field-value ...
0   Id:92 Ref-7ADT DTime-1443476076 ...
1   Id:11 Ref-7ADT DTime-1443476076 ...

然后,您通过执行id进行定位hgetall id:92。至于按日期范围查询,你需要做的ZRANGEBYSCORE sortedset mindate maxdate,然后hgetall由每一个ID只能有一个。您最好使用lua将这些命令包装为一个,这样仍然会非常快!

NoSql数据库中的数据需要采用上述冗余方式进行组织。这可能会使一些常规操作涉及多个命令和往返,但是可以通过redis的lua功能解决。我强烈推荐redis的lua功能,使它将命令包装到一个网络往返中,这些命令都在redis服务器端执行,并且原子且超快!

如果您不知道有什么请回覆



 类似资料:
  • 问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持

  • 问题内容: 我有一些如下所示的元素: 如何向属性值为(零)的元素添加类? 我尝试了许多不同的解决方案,但没有任何效果。一个例子: 任何的想法? 问题答案: 使用属性等于选择器 它在树上起作用 获取当前匹配元素集中每个元素的后代,并通过选择器,jQuery对象或元素进行过滤。

  • 问题内容: 我正在尝试查找具有Attribute的元素。好吧,我可以在Selenium中找到具有Id,tagName,Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一种方法,该方法将给定属性名称和值作为输入专门返回WebElement。 假设XPath不是一个选择,还有其他更好的方法吗? 问题答案: 您可以使用CSS轻松完成此任务。 公式为: 所以如果有的话 您可以使用以下方法找到它:

  • 我正在尝试查找具有属性的元素。我可以在Selenium中找到Id、tagName、Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一个方法,专门返回WebElement,给定属性名和值作为输入。 假设XPath不是一个选项,还有其他更好的方法吗?

  • 问题内容: 好吧,标题说明了一切。我正在做的是创建一个特色产品模块。使用JSON填充尺寸的下拉列表,并且我使用把手来呈现html。我无法控制JSON文件。我尝试通过选项标签中的实际文本对选项值进行排序,但后来我意识到选项值是错误的。因此,现在我尝试按其值属性对选项进行排序,但尚未弄清楚。我正在尝试做这样的事情: 这是HTML: 问题答案: 在这里,您可以找到一个演示并将结果与​​原始结果进行比较:

  • 问题内容: 如果我有一个JavaScript对象,例如: 有没有一种方法可以基于值对属性进行排序?这样我最终 问题答案: 将它们移动到一个数组,对该数组进行排序,然后将其用于您的目的。这是一个解决方案: 拥有数组后,您可以按自己喜欢的顺序从数组中重建对象,从而完全实现了您打算要做的事情。在我所知道的所有浏览器中都可以使用,但这取决于实现的怪癖,并且可能随时中断。您永远不应假设JavaScript对