REDIS将排序时间排序为两种类型

时间:2018-03-08 06:50:30

标签: redis

REDIS 4.0.8

我想按createDateendDate排序以下数据:

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

1 个答案:

答案 0 :(得分:1)

  1. Redis排序集得分为64位浮点数,并支持53位整数范围。 -(2^53) to +(2^53)(包括两者)或-9007199254740992和9007199254740992

  2. 这允许同时屏蔽createDate和amp;结束日期得分。 性能优化的方法是将得分的所有位设置为零,并且对于createDate使用左25位,对于53整数位的endDate使用右25位。在这种情况下,createDate& endDate将是日期开头的unixtimestamp。

  3. 更简单的方法是使用日期的字符串连接及其转换为数字。 例如:

    >>> endDate = "20180308"
    >>> createDate = "20180305"
    >>> endDate+createDate
    '2018030820180305'
    >>> int(endDate+createDate) < 9007199254740992
    True
    
  4. createDate&amp; endDates附加在一起并转换为数字小于整数值redis排序集得分,我们可以利用这个优势。

    1. 要查找大于endDate的项目,比现在更早,即今天的日期,您可以使用ZRANGEBYSCORE得分min = 2018030800000000(您也可以使用最高得分来获得endDate范围而不是更旧) 。此结果将按得分的右侧部分进行排序,即createDate表示为整数。
    2. 此方法仅适用于YYYY / MM / DD或DD / MM / YYYY日期格式,因为它们基于字符串的词法排序&amp;数字表示排序产生相同的结果。对于像MM / DD / YYYY这样的美国日期格式,这将失败。

相关问题