REDIS 4.0.8
我想按createDate
和endDate
排序以下数据:
info.item:*
field : createDate , endDate , Name
createDate is now time to NumericTime
endDate is A randomly set date at after now
Name is anything
我在item_List中设置了info.item:*:
zadd item_List endDate info.item:*
if createDate is 2018-03-06 to Numeric of info.item:1
endDate is 2018-03-07 to Numeric
(下次,跳过'到Numeric')
createDate is 2018-03-08 of info.item:2
endDate is 2018-03-12
createDate is 2018-03-09 of info.item:3
endDate is 2018-03-10
createDate is 2018-03-10 of info.item:4
endDate is 2018-03-22
使用zrangebyscore
zrangebyscore endtime_Bucket 2018-03-08 +inf
i got
info.item:3
info.item:2
info.item:4
结果是正确的。
此外,我想在createDate
晚于现在时按endDate
排序
我期待这个结果:
info.item:4
info.item:3
info.item:2
但失败了。
我尝试了排序命令:
sort item_List by *->createDate desc
结果:
info.item:4
info.item:3
info.item:2
info.item:1
如果endDate
比现在更早并按createDate
排序,我该如何排除项目?
现在是2018-03-08
答案 0 :(得分:1)
Redis排序集得分为64位浮点数,并支持53位整数范围。
-(2^53) to +(2^53)
(包括两者)或-9007199254740992和9007199254740992
这允许同时屏蔽createDate和amp;结束日期得分。 性能优化的方法是将得分的所有位设置为零,并且对于createDate使用左25位,对于53整数位的endDate使用右25位。在这种情况下,createDate& endDate将是日期开头的unixtimestamp。
更简单的方法是使用日期的字符串连接及其转换为数字。 例如:
>>> endDate = "20180308"
>>> createDate = "20180305"
>>> endDate+createDate
'2018030820180305'
>>> int(endDate+createDate) < 9007199254740992
True
createDate&amp; endDates附加在一起并转换为数字小于整数值redis排序集得分,我们可以利用这个优势。
ZRANGEBYSCORE
得分min = 2018030800000000(您也可以使用最高得分来获得endDate范围而不是更旧)
。此结果将按得分的右侧部分进行排序,即createDate表示为整数。此方法仅适用于YYYY / MM / DD或DD / MM / YYYY日期格式,因为它们基于字符串的词法排序&amp;数字表示排序产生相同的结果。对于像MM / DD / YYYY这样的美国日期格式,这将失败。