Redis教程10-列表(List)常用命令使用参考2
1.LPOP
LPOP key
移除并返回列表 key 的头元素。
可用版本:>= 1.0.0
时间复杂度:O(1)
返回值:
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> rpush ages 00 11 22 33 44 55 66 // 创建列表 (integer) 7 127.0.0.1:6379> lpop ages // 移除头第一个元素 "00" 127.0.0.1:6379> lpop ages // 继续移除头第一个元素 "11" 127.0.0.1:6379> lpop names // key不存在, 返回nil (nil) 127.0.0.1:6379> set name redis666 OK 127.0.0.1:6379> lpop name // key类型不匹配, 报错 (error) WRONGTYPE Operation against a key holding the wrong kind of value
2.LPUSH
LPUSH key value [value ...]
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。
可用版本:>= 1.0.0
时间复杂度:O(1)
返回值:执行 LPUSH 命令后,列表的长度。
127.0.0.1:6379> exists ages (integer) 0 127.0.0.1:6379> lpush ages 00 11 // 添加多个元素 (integer) 2 127.0.0.1:6379> lrange ages 0 -1 1) "11" 2) "00" 127.0.0.1:6379> lpush ages 22 // 添加单个元素 (integer) 3 127.0.0.1:6379> lpush ages 22 // 添加重复元素, 列表允许重复元素 (integer) 4 127.0.0.1:6379> lrange ages 0 -1 1) "22" 2) "22" 3) "11" 4) "00"
3.LPUSHX
LPUSHX key value
将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。
和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。
可用版本:>= 2.2.0
时间复杂度:O(1)
返回值:LPUSHX 命令执行之后,表的长度。
127.0.0.1:6379> exists ages (integer) 0 127.0.0.1:6379> lpushx ages 00 // key不存在, 不进行操作 (integer) 0 127.0.0.1:6379> exists ages (integer) 0 127.0.0.1:6379> lpush ages 00 // 创建列表ages (integer) 1 127.0.0.1:6379> lrange ages 0 -1 1) "00" 127.0.0.1:6379> lpushx ages 11 // 这次lpushx操作成功 (integer) 2 127.0.0.1:6379> lrange ages 0 -1 1) "11" 2) "00"
4.LRANGE
LRANGE key start stop
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
注意LRANGE命令和编程语言区间函数的区别
假如你有一个包含一百个元素的列表,对该列表执行 LRANGE list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LRANGE 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.new 、 Array#slice 和Python的 range() 函数。
超出范围的下标
超出范围的下标值不会引起错误。
如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。
如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。
可用版本:>= 1.0.0
时间复杂度:O(S+N), S 为偏移量 start , N 为指定区间内元素的数量。
返回值:一个列表,包含指定区间内的元素。
127.0.0.1:6379> rpush ages 00 11 22 33 44 55 66 (integer) 7 127.0.0.1:6379> lrange ages 0 -1 // 第一个元素到最后一个元素 1) "00" 2) "11" 3) "22" 4) "33" 5) "44" 6) "55" 7) "66" 127.0.0.1:6379> lrange ages 0 2 // 第一个元素到第三个元素 1) "00" 2) "11" 3) "22" 127.0.0.1:6379> lrange ages 0 10 // stop超过最大范围, 忽略超过部分 1) "00" 2) "11" 3) "22" 4) "33" 5) "44" 6) "55" 7) "66" 127.0.0.1:6379> lrange ages 7 10 // start和end都不在范围内 (empty list or set) 127.0.0.1:6379> lrange ages 0 0 1) "00" 127.0.0.1:6379>
5.LREM
LREM key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素。
count 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
- count = 0 : 移除表中所有与 value 相等的值。
可用版本:>= 1.0.0
时间复杂度:O(N), N 为列表的长度。
返回值:
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> 127.0.0.1:6379> rpush words aaa bbb ccc aaa bbb ccc aaa bbb ccc // 创建列表 (integer) 9 127.0.0.1:6379> lrange words 0 -1 1) "aaa" 2) "bbb" 3) "ccc" 4) "aaa" 5) "bbb" 6) "ccc" 7) "aaa" 8) "bbb" 9) "ccc" 127.0.0.1:6379> lrem words 2 aaa // 移除从表头到表尾,最先发现的两个 aaa (integer) 2 127.0.0.1:6379> lrange words 0 -1 // 前两个aaa被删除了 1) "bbb" 2) "ccc" 3) "bbb" 4) "ccc" 5) "aaa" 6) "bbb" 7) "ccc" 127.0.0.1:6379> lrem words -2 bbb // 移除从表尾到表头,最先发现的两个bbb (integer) 2 127.0.0.1:6379> lrange words 0 -1 1) "bbb" 2) "ccc" 3) "ccc" 4) "aaa" 5) "ccc" 127.0.0.1:6379> lrem words 0 ccc // 移除表中所有 ccc (integer) 3 127.0.0.1:6379> lrange words 0 -1 1) "bbb" 2) "aaa"