• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • xrange 命令

    xrange命令返回流中满足给定ID范围的条目。范围由最小和最大ID指定。所有ID在指定的两个ID之间或与其中一个ID相等(闭合区间)的条目将会被返回。


    XRANGE命令有许多用途:

    • 返回特定时间范围的项目。这是可能的,因为流的ID与时间相关。
    • 增量迭代流,每次迭代只返回几个项目。但它在语义上比SCAN函数族强大很多。
    • 从流中获取单个条目,提供要获取两次的条目的ID:作为查询间隔的开始和结束。

    该命令还有一个倒序命令,以相反的顺序返回项目,叫做XREVRANGE,除了返回顺序相反以外,它们是完全相同的。

    语法

    XRANGE key start end[COUNT count]
    • key :队列名。
    • start :开始值,- 表示最小值。
    • end :结束值,+ 表示最大值。
    • count :数量。

    返回值

    该命令返回ID与指定范围匹配的条目。返回的条目是完整的,这意味着ID和所有组成条目的字段都将返回。此外,返回的条目及其字段和值的顺序与使用XADD添加它们的顺序完全一致。

    特殊ID:-+

    特殊ID-+分别表示流中可能的最小ID和最大ID,因此,以下命令将会返回流中的每一个条目:

    redis> XRANGE somestream - +
    1) 1) 1526985054069-0
       2) 1) "duration"
          2) "72"
          3) "event-id"
          4) "9"
          5) "user-id"
          6) "839248"
    2) 1) 1526985069902-0
       2) 1) "duration"
          2) "415"
          3) "event-id"
          4) "2"
          5) "user-id"
          6) "772213"
    ... other entries here ...
    

    - ID实际上与指定0-0完全一样,而+则相当于18446744073709551615-18446744073709551615,但是它们更适合输入。

    不完全ID

    流的ID由两部分组成,一个Unix毫秒时间戳和一个为同一毫秒插入的序列号。使用XRANGE仅指定ID的第一部分是可能的,即毫秒时间部分,如下面的例子所示:

    redis> XRANGE somestream 1526985054069 1526985055069
    

    在这种情况中,XRANGE将会使用-0自动补全开始ID,以及使用-18446744073709551615自动补全结束ID,以便返回所有在两个毫秒值之间生成的条目。这同样意味着,重复两个相同的毫秒时间,我们将会得到在这一毫秒内产生的所有条目,因为序列号范围将从0到最大值。

    以这种方式使用XRANGE用作范围查询命令以在指定时间内获取条目。这非常方便,以便访问流中过去事件的历史记录。

    返回最大条目数

    使用COUNT选项可以减少报告的条目数。这是一个非常重要的特性,虽然它看起来很边缘,因为它允许,例如,模型操作,比如给我大于或等于以下ID的条目

    redis> XRANGE somestream 1526985054069-0 + COUNT 1
    1) 1) 1526985054069-0
       2) 1) "duration"
          2) "72"
          3) "event-id"
          4) "9"
          5) "user-id"
          6) "839248"
    

    在上面的例子中,条目1526985054069-0存在,否则服务器将发送给我们下一个条目。使用COUNT也是使用XRANGE作为迭代器的基础。

    迭代流

    为了迭代流,我们可以如下进行。让我们假设每次迭代我们需要两个元素。我们开始获取前两个元素,这是微不足道的:

    redis> XRANGE writers - + COUNT 2
    1) 1) 1526985676425-0
       2) 1) "name"
          2) "Virginia"
          3) "surname"
          4) "Woolf"
    2) 1) 1526985685298-0
       2) 1) "name"
          2) "Jane"
          3) "surname"
          4) "Austen"
    

    然后,不是从-再次开始迭代,我们使用前一次XRANGE调用中返回的最后的条目ID作为范围的开始,将ID的序列部分加1。

    最后一个条目的ID是1526985685298-0,所以我们只需要在序列中加1以获得1526985685298-1,并继续我们的迭代:

    redis> XRANGE writers 1526985685298-1 + COUNT 2
    1) 1) 1526985676425-0
       2) 1) "name"
          2) "Virginia"
          3) "surname"
          4) "Woolf"
    2) 1) 1526985685298-0
       2) 1) "name"
          2) "Jane"
          3) "surname"
          4) "Austen"
    

    依此类推,最终,这将允许访问流中的所有条目。很明显,我们可以从任意ID开始迭代,或者甚至从特定的时间开始,通过提供一个不完整的开始ID。此外,我们可以限制迭代到一个给定的ID或时间安,通过提供一个结束ID或不完整ID而不是+

    XREAD命令同样可以迭代流。XREVRANGE命令可以反向迭代流,从较高的ID(或时间)到较低的ID(或时间)。

    获取单个项目

    如果你在查找一个XGET命令,你将会失望,因为XRANGE实际上就是从流中获取单个条目的方式。所有你需要做的,就是在XRANGE的参数中指定ID两次:

    redis> XRANGE mystream 1526984818136-0 1526984818136-0
    1) 1) 1526984818136-0
       2) 1) "duration"
          2) "1532"
          3) "event-id"
          4) "5"
          5) "user-id"
          6) "7782813"
    


    例子

    redis> XADD writers * name Virginia surname Woolf
    "1539863591459-0"
    
    redis> XADD writers * name Jane surname Austen
    "1539863591460-0"
    
    redis> XADD writers * name Toni surname Morris
    "1539863591460-1"
    
    redis> XADD writers * name Agatha surname Christie
    "1539863591461-0"
    
    redis> XADD writers * name Ngozi surname Adichie
    "1539863591462-0"
    
    redis> XLEN writers
    (integer) 5
    
    redis> XRANGE writers - + COUNT 2
    1) 1) "1539863591459-0"
       2) 1) "name"
    	  2) "Virginia"
    	  3) "surname"
    	  4) "Woolf"
    2) 1) "1539863591460-0"
       2) 1) "name"
    	  2) "Jane"
    	  3) "surname"
    	  4) "Austen"
    

    上篇:xlen 命令

    下篇:xrevrange 命令