gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:01:34 27 4
gpt4 key购买 nike

在 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 数据库那样查询这个数据结构,但我尝试使用 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/

In Redis, data can only be queried by its key. Even if we use a hash, we can't say get me the keys wherever the field race is equal to 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 可能会以这种方式工作,我将不得不过滤代码中的结果以找到其属性中具有确切值的那个。

仍然欢迎建议。

最佳答案

我觉得很简单

方案一(较差,不推荐)

您的 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

方案二(更好,强烈推荐)

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 ...

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

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

有什么不懂的可以回复

关于Redis - 排序集,按属性值查找项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32854616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com