Redis list(列表) 类型是用来存储多个有序的字符串,list中的每个字符串称为一个元素,一个列表最多可以存储232-1个元素;
在Redis中可以对列表两端进行操作,比如插入(push)操作和弹出(pop)操作,在实际应用中,可以使用list 当作栈或队列的角色。
列表中的元素是有序的、可以重复的;
列表类型,Redis 提供了以下命令:
rpush
key value [value1 value2 ...]lpush
key value [value1 value2 ...]linsert
key before|after pivot valuelpop
keyrpop
keylrem
key count valueltrim
key start end lrange
key start end lindex
key indexllen
key lset
key index newValueblpop
key [key1 key2 ...] timeoutbrpop
key [key1 key2 ...] timeoutrpush
key value [value1 value2 ...]从右侧插入元素。
如果key不存在,则会自动创建该key,然后再进行右侧插入;如果key已存在但不是列表,则会报错;
可以一次插入多个元素,依次从插入命令的左侧开始向列表右侧插入,结果返回该list 的长度。
可用版本:
>= 1.0.0 (2.4.0版本以后支持插入多个元素)
时间复杂度:
O(1)
10.6.25.66:9000> rpush listkey value1
(integer) 1
10.6.25.66:9000> rpush listkey value2
(integer) 2
10.6.25.66:9000> lrange listkey 0 -1
1) "value1"
2) "value2"
10.6.25.66:9000> set listkey 1
OK
10.6.25.66:9000> type listkey
string
10.6.25.66:9000> rpush listkey value3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
lpush
key value [value1 value2 ...]从左侧插入元素。
如果key不存在,则会自动创建该key,然后再进行左侧插入;如果key已存在但不是列表,则会报错;
可以一次插入多个元素,依次从插入命令的左侧开始向列表左侧插入,结果返回该list 的长度。
可用版本:
>= 1.0.0 (2.4.0版本以后支持插入多个元素)
时间复杂度:
O(1)
10.6.25.66:9000> lpush listkey value1
(integer) 1
10.6.25.66:9000> lpush listkey value2
(integer) 2
10.6.25.66:9000> lrange listkey 0 -1
1) "value2"
2) "value1"
10.6.25.66:9000> set listkey string
OK
10.6.25.66:9000> lpush listkey value3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
linsert
key before|after pivot value向某一个元素前或元素后插入元素。
linsert 命令会在列表中找到等于pivot 这个元素,然后在这个元素的前面或者后面插入一个新的元素value
结果会返回插入后的list 长度;如果list 不存在,则不做操作,如果pivot 不存在,则返回-1。
可用版本:
>= 2.2.0
时间复杂度:
O(N) N 为pivot的index
10.6.25.66:9000> lpush listkey value1 value2 value3 value4 value5
(integer) 5
(0.56s)
10.6.25.66:9000> linsert listkey before value3 insertvalue
(integer) 6
10.6.25.66:9000> lrange listkey 0 -1
1) "value5"
2) "value4"
3) "insertvalue"
4) "value3"
5) "value2"
6) "value1"
rpop
key在list 中从右边弹出第一个元素。
结果会返回被弹出的元素值,如果该list不存在,则返回nil。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
10.6.25.66:9000> rpop listkey
"value1"
10.6.25.66:9000> lrange listkey 0 -1
1) "value4"
2) "insertvalue"
3) "value3"
4) "value2"
lpop
key在list 中从左边弹出第一个元素。
结果会返回被弹出的元素值,如果该list不存在,则返回nil。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
10.6.25.66:9000> lpop listkey
"value5"
10.6.25.66:9000> lrange listkey 0 -1
1) "value4"
2) "insertvalue"
3) "value3"
4) "value2"
5) "value1"
10.6.25.66:9000> lpop notexsitlist
(nil)
lrem
key count value在list 中删除指定元素。
该命令会在list 中遍历,删除等于value 的元素,根据count 值不同可以分为三种情况:
返回结果为删除的个数。
可用版本:
>= 1.0.0
时间复杂度:
O(N)
10.6.25.66:9000> lpush listkey a b c d e f g a b cd ef g a a a bb c
(integer) 17
10.6.25.66:9000> lrem listkey 3 a
(integer) 3
10.6.25.66:9000> lrange listkey 0 -1
1) "c"
2) "bb"
3) "g"
4) "ef"
5) "cd"
6) "b"
7) "a"
8) "g"
9) "f"
10) "e"
11) "d"
12) "c"
13) "b"
14) "a"
10.6.25.66:9000> lrem listkey -2 c
(integer) 2
10.6.25.66:9000> lrange listkey 0 -1
1) "bb"
2) "g"
3) "ef"
4) "cd"
5) "b"
6) "a"
7) "g"
8) "f"
9) "e"
10) "d"
11) "b"
12) "a"
10.6.25.66:9000> lrem listkey 0 a
(integer) 2
10.6.25.66:9000> lrange listkey 0 -1
1) "bb"
2) "g"
3) "ef"
4) "cd"
5) "b"
6) "g"
7) "f"
8) "e"
9) "d"
10) "b"
ltrim
key start end按照索引范围修剪list。start 和end 为整数,表示list 中的集合下标,修剪后会保留start 与end 中间的元素,包括start和end,如果为start 或end 为负数,则是从右侧开始修剪。
如果start 超出列表尾部,或者start > end,结果会变成空的列表,如果end 超过列表尾部,Redis 会将其当作列表的最后一个元素。
可用版本:
>= 1.0.0
时间复杂度:
O(N) ,N 为通过该操作,移除的列表长度。
10.6.25.66:9000> ltrim listkey 0 2
OK
10.6.25.66:9000> lrange listkey 0 -1
1) "bb"
2) "g"
3) "ef"
10.6.25.66:9000> ltrim listkey -1 -4
OK
10.6.25.66:9000> lrange listkey 0 -1
(empty list or set)
lrange
key start end返回list 列表中指定范围的元素。
可用版本:
>= 1.0.0
时间复杂度:
O(S+N) ,S 为start 的偏移量,N 为start 与 end 之间的范围数量。
10.6.25.66:9000> lpush listkey a b c d e f d g h i j k
(integer) 12
10.6.25.66:9000> lrange listkey 0 -1
1) "k"
2) "j"
3) "i"
4) "h"
5) "g"
6) "d"
7) "f"
8) "e"
9) "d"
10) "c"
11) "b"
12) "a"
10.6.25.66:9000> lrange listkey 3 5
1) "h"
2) "g"
3) "d"
lindex
key index返回list 列表中对应index 索引的元素。
可用版本:
>= 1.0.0
时间复杂度:
O(N) ,N 代表index 下标,如果下标为0 或 -1 则复杂度就是O(1)。
10.6.25.66:9000> lindex listkey 2
"i"
10.6.25.66:9000> lindex listkey 4
"g"
llen
key返回list 列表中元素的长度,如果list 不存在,则返回0,如果key不为list ,则返回错误。
可用版本:
>= 1.0.0
时间复杂度:
O(1)
10.6.25.66:9000> llen listkey
(integer) 12
10.6.25.66:9000> llen nokey
(integer) 0
10.6.25.66:9000> set key 1
OK
10.6.25.66:9000> llen key
(error) WRONGTYPE Operation against a key holding the wrong kind of value
lset
key index newValue将list 列表中,index 位置的元素替换成新的newValue,如果index 超过范围,则报错。
可用版本:
>= 1.0.0
时间复杂度:
O(N),N 为下标值。
10.6.25.66:9000> lset listkey 4 4
OK
10.6.25.66:9000> lrange listkey 0 -1
1) "k"
2) "j"
3) "i"
4) "h"
5) "4"
6) "d"
7) "f"
8) "e"
9) "d"
10) "c"
11) "b"
12) "a"
10.6.25.66:9000> lset listkey 15 0
(error) ERR index out of range
blpop
key [key1 key2 ... ] timeout阻塞式列表弹出。
和lpop 类似 ,但是该命令是阻塞式,简单通俗的讲,就是在使用该命令之后,redis 会去指定的list 列表(多个)中,顺序弹出第一个非空列表的头
元素。
如果给定的所有list key 全部为空列表,则该命令会阻塞,直到有其它客户端对指定的key中的某个key 进行lpush (rpush)操作才会返回值。
返回结果为:第一个非空列表的头
元素加上该列表的key,而后面的timeout 则为阻塞时间,超过该时间,没有新的lpush(rpush)操作,则直接返回多个nil 的组合值,timeout 设置为0,则是无限期阻塞,直到有操作。
可用版本:
>= 2.0.0
时间复杂度:
O(1)
brpop
key [key1 key2 ... ] timeout阻塞式列表弹出。
和rpop 类似 ,但是该命令是阻塞式,简单通俗的讲,就是在使用该命令之后,redis 会去指定的list 列表(多个)中,顺序弹出第一个非空列表的尾
元素。
如果给定的所有list key 全部为空列表,则该命令会阻塞,直到有其它客户端对指定的key中的某个key 进行lpush (rpush)操作才会返回值。
返回结果为:第一个非空列表的尾
元素加上该列表的key,而后面的timeout 则为阻塞时间,超过该时间,没有新的lpush(rpush)操作,则直接返回多个nil 的组合值,timeout 设置为0,则是无限期阻塞,直到有操作。
可用版本:
>= 2.0.0
时间复杂度:
O(1)