在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/
在Redis中,只能通过密钥查询数据。即使我们使用哈希, 我们不能说在场比赛相等的地方给我钥匙 萨扬
编辑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可能会以这种方式工作,我将不得不在代码中过滤结果,以找到其属性中具有确切值的那个。
仍然愿意接受建议。
答案 0 :(得分:2)
我认为这很简单。
您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
是好的。这仍然是“通过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端执行的,并且是原子级和超快的!
如果您不知道任何内容,请回复