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
时间复杂度:
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 过程中经过的元素数量。
返回值:
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