zoukankan      html  css  js  c++  java
  • Redis教程10-列表(List)常用命令使用参考1

    1.BLPOP

    BLPOP key [key ...] timeout

    BLPOP 是列表的阻塞式(blocking)弹出原语。

    它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。

    当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。

    非阻塞行为

    当 BLPOP 被调用时,如果给定 key 内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字一起,组成结果返回给调用者。

    当存在多个给定 key 时, BLPOP 按给定 key 参数排列的先后顺序,依次检查各个列表。

    假设现在有 job 、 command 和 request 三个列表,其中 job 不存在, command 和 request 都持有非空列表。考虑以下命令:

    BLPOP job command request 0

    BLPOP 保证返回的元素来自 command ,因为它是按”查找 job -> 查找 command -> 查找 request “这样的顺序,第一个找到的非空列表。

    redis> DEL job command request           # 确保3个key都被删除
    (integer) 0
    redis> LPUSH command "update system..."  # 为command列表增加一个值
    (integer) 1
    redis> LPUSH request "visit page"        # 为request列表增加一个值
    (integer) 1
    redis> BLPOP job command request 0       # job 列表为空,被跳过,紧接着 command 有值, 所以列表的第一个元素被弹出。
    1) "command"                             # 弹出元素所属的列表
    2) "update system..."                    # 弹出元素所属的值

    阻塞行为

    如果所有给定 key 都不存在或包含空列表,那么 BLPOP 命令将阻塞连接,直到等待超时,或有另一个客户端对给定 key 的任意一个执行 LPUSH或 RPUSH 命令为止。

    超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长(block indefinitely) 。

    redis> EXISTS job                # 确保两个 key 都不存在
    (integer) 0
    redis> EXISTS command
    (integer) 0
    
    redis> BLPOP job command 300     # 因为key一开始不存在,所以操作会被阻塞,直到另一客户端对 job 或者 command 列表进行 PUSH 操作。
    1) "job"                         # 假设此时另一个客户端 push 的是 job
    2) "do my home work"             # 被弹出的值
    (26.26s)                         # 等待的秒数
    
    redis> BLPOP job command 5       # 等待超时的情况
    (nil)
    (5.66s)                          # 等待的秒数

    在MULTI/EXEC事务中的BLPOP

    BLPOP 可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在 MULTI / EXEC 块当中没有意义。因为这要求整个服务器被阻塞以保证块执行时的原子性,该行为阻止了其他客户端执行 LPUSH 或 RPUSH 命令。

    因此,一个被包裹在 MULTI / EXEC 块内的 BLPOP 命令,行为表现得就像 LPOP 一样,对空列表返回 nil ,对非空列表弹出列表元素,不进行任何阻塞操作。

    2.BRPOP

    BRPOP key [key ...] timeout

    BRPOP 是列表的阻塞式(blocking)弹出原语。

    它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。

    当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。

    关于阻塞操作的更多信息,请查看 1.BLPOP 命令, BRPOP 除了弹出元素的位置和 BLPOP 不同之外,其他表现一致。

    3.LINDEX

    LINDEX key index

    返回列表 key 中,下标为 index 的元素。

    下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

    你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

    如果 key 不是列表类型,返回一个错误。

    可用版本:>= 1.0.0

    时间复杂度:

    O(N), N 为到达下标 index 过程中经过的元素数量。
    因此,对列表的头元素和尾元素执行 LINDEX 命令,复杂度为O(1)。
    返回值:
    列表中下标为 index 的元素。
    如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
    127.0.0.1:6379> rpush ages 00 11 22 33 44    // 创建列表ages
    (integer) 5
    127.0.0.1:6379> lrange ages 0 -1    // 查看所有元素
    1) "00"
    2) "11"
    3) "22"
    4) "33"
    5) "44"
    127.0.0.1:6379> llen ages    // 列表长度
    (integer) 5
    127.0.0.1:6379> lindex ages 0    // 列表第一个元素
    "00"
    127.0.0.1:6379> lindex ages 4    // 列表第五个元素
    "44"
    127.0.0.1:6379> lindex ages 5    // 不再列表范围, 返回nil
    (nil)
    127.0.0.1:6379> lindex ages -1    // 列表最后一个元素
    "44"
    127.0.0.1:6379> lindex ages -2    // 列表倒数第二个元素
    "33"
    127.0.0.1:6379> lindex names 0    // key不存在, 返回nil
    (nil)
    127.0.0.1:6379> set name redis666
    OK
    127.0.0.1:6379> lindex name 0    // key不是列表, 报错
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

    4.LINSERT

    LINSERT key BEFORE|AFTER pivot value

    将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

    当 pivot 不存在于列表 key 时,不执行任何操作。

    当 key 不存在时, key 被视为空列表,不执行任何操作。

    如果 key 不是列表类型,返回一个错误。

    可用版本:>= 2.2.0

    时间复杂度:O(N), N 为寻找 pivot 过程中经过的元素数量。

    返回值:

    如果命令执行成功,返回插入操作完成之后,列表的长度。
    如果没有找到 pivot ,返回 -1 。
    如果 key 不存在或为空列表,返回 0 。
    127.0.0.1:6379> rpush ages 00 11 22 33    // 创建列表
    (integer) 4
    127.0.0.1:6379> lrange ages 0 -1
    1) "00"
    2) "11"
    3) "22"
    4) "33"
    127.0.0.1:6379> linsert ages after 22 2    // 22后面插入2
    (integer) 5
    127.0.0.1:6379> lrange ages 0 -1    // 查看
    1) "00"
    2) "11"
    3) "22"
    4) "2"
    5) "33"
    127.0.0.1:6379> linsert ages before 11 1    // 在11前面插入1
    (integer) 6
    127.0.0.1:6379> lrange ages 0 -1
    1) "00"
    2) "1"
    3) "11"
    4) "22"
    5) "2"
    6) "33"
    127.0.0.1:6379> linsert ages after 111 1    // 111不存在, 返回-1, 操作失败
    (integer) -1
    127.0.0.1:6379> linsert names after tome zhangsan    // key不存在, 返回0
    (integer) 0

    5.LLEN

    LLEN key

    返回列表 key 的长度。

    如果 key 不存在,则 key 被解释为一个空列表,返回 0 .

    如果 key 不是列表类型,返回一个错误。

    可用版本:>= 1.0.0

    时间复杂度:O(1)

    返回值:列表 key 的长度。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> rpush ages 00 11 22 33 44 55    // 创建列表
    (integer) 6
    127.0.0.1:6379> llen ages    // 长度6
    (integer) 6
    127.0.0.1:6379> llen names    // key不存在, 返回0
    (integer) 0
    127.0.0.1:6379> set name redis666    // 字符串
    OK
    127.0.0.1:6379> llen name    // key类型不匹配, 报错
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
  • 相关阅读:
    IIS:日志代码分析
    SQL:查找被锁的表,以及锁表的SQL语句(重点推荐)
    SQL 2000/2005/2008 收缩日志方法
    SQL SERVER:使用工具观察与分析数据库中锁信息
    C# : Post 接收或发送XML
    WCF:没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的。
    SQL2005 遍历表插入
    SQL2005:SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法
    C#:安装Windows服务,动态指定服务名及描述
    IE6与 javascript:void(0)
  • 原文地址:https://www.cnblogs.com/no-celery/p/13710167.html
Copyright © 2011-2022 走看看