• Redis的阻塞式列表解析


    1.   命令帮助

    通过Redis-cli中的help进行查看:

    127.0.0.1:6379>help BLPOP

     

      BLPOP key [key ...] timeout

      summary: Remove and get the first element ina list, or block until one is available

      since: 2.0.0

      group: list

     

    127.0.0.1:6379>help BRPOP

     

      BRPOP key [key ...] timeout

      summary: Remove and get the last element in alist, or block until one is available

      since: 2.0.0

      group: list

    通过列表详细描述:

    命令

    作用

    复杂度

    BLPOP key [key ...] timeout

    LPOP 命令的阻塞版本;命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最左端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止;
    设置 timeout参数为0表示永远阻塞。

    O(N),N 为输入列表的数量。

    BRPOP key [key ...] timeout

    RPOP命令的阻塞版本: 命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最右端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止;
    设置 timeout参数为0表示永远阻塞。

    O(N),N 为输入列表的数量。

     

     

    2. BLPOP/BRPOP实战

    访问四个空的列表,并且设置阻塞时间为60秒

    127.0.0.1:6379>BLPOP list1list2 list3 list4 60

    (nil)

    (60.02s)

    通过返回的结果,nil表示等待超时,没有弹出数据,同时60.02s表示客户端被阻塞的时长。

     

    下面我们设置list1列表的值为"Spark" "Hadoop" "Hive",然后再进行如下操作:

    127.0.0.1:6379>RPUSH list1  "Spark" "hadoop""hive"

    (integer) 3

    127.0.0.1:6379>LRANGE list1 0 -1

    1)"Spark"

    2)"Hadoop"

    3)"Hive"

     

    127.0.0.1:6379>BLPOP list1 list2 list3 list4 60

    1)"list1" #执行弹出操作的列表

    2)"Spark" #被弹出的项

    我们发现list1不为空,于是执行弹出命令(#后面为注释)。

     

    我们也可以先执行阻塞操作,然后在等待过程设置列表的值,如下:

    终端A: 执行如下命令,阻塞中

    127.0.0.1:6379>BLPOP list2 list3 list4 60

     

    终端B: 设置list2值

    127.0.0.1:6379>RPUSH list2 "Scala" "Sqoop"

    (integer) 2

     

    同时我们查看终端A时会发现,已经弹出结果了

    127.0.0.1:6379>BLPOP list2 list3 list4 60

    1)"list2" #执行弹出操作的列表

    2)"scala" #被弹出的项

    (6.28s)    #客户端被阻塞的时长

     

     

    3. 下面介绍几种情形:

    3.1 非阻塞

    当发现给定的列表中至少一个非空列表时,BLPOP和BRPOP就会立即从那个列表里面弹出元素,

    在这种情况下,BLPOP就像一个接受多参数的LPOP命令,而BRPOP就像一个接受多参数的RPOP命令。

     

    3.2 阻塞并超时

    如果所有给定的列表都是空的,那么BLPOP/BRPOP将被被阻塞。

    如果在阻塞的过程中,给定的列表一直没有新项被推入,那么当设定的超时时间到达之后,

    命令将向被阻塞的客户端返回nil。

     

    3.3 阻塞并弹出情况

    如果在客户端A被阻塞的过程中,有另一个客户端B给造成客户端A被阻塞的列表推入了新项,那么

    服务器会将这个新项返回给客户端A。

     

    4. BLPOP/BRPOP的先到先服务原则

    如果有多个客户端同时因为某个列表而被阻塞,那么当有新值被推入到这个列表时,服务器就会按照先到先服务原则,优先向最早被阻塞的客户端返回新值。

  • 相关阅读:
    DB2 关联更新
    postgresql 开启审计日志
    Delphi D10.X中Tpath引发的单元引用及代码编写的思考
    自己写的函数或者过程与Delphi提供的重名了怎么办?(50分)
    技巧四 Delphi XE3 代码自动提示bug解决
    想开发经典界面吗?
    初涉Delphi下Windows消息机制——同一程序内自定义消息实例
    Delphi的DirectShow开发概述
    delphi接口(抄自万一)
    fkInternalCalc和fkCalculated有何区别?
  • 原文地址:https://www.cnblogs.com/fuwentao/p/7385427.html
Copyright © 2020-2023  润新知