Redis list(列表) 类型是用来存储多个有序的字符串,list中的每个字符串称为一个元素,一个列表最多可以存储232-1个元素;
在Redis中可以对列表两端进行操作,比如插入(push)操作和弹出(pop)操作,在实际应用中,可以使用list 当作栈或队列的角色。

列表中的元素是有序的、可以重复的;


列表类型,Redis 提供了以下命令:

从右侧插入元素。

如果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
                

从左侧插入元素。

如果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 命令会在列表中找到等于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"
                

在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"
                

在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)
                

在list 中删除指定元素。

该命令会在list 中遍历,删除等于value 的元素,根据count 值不同可以分为三种情况:

  • count > 0 : 从左到右,删除最多count 个元素;
  • count < 0 : 从右到左,删除最多count 个元素;
  • count = 0 : 删除所有等于value的元素;

返回结果为删除的个数。

可用版本:>= 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"
                

按照索引范围修剪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)
                

返回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"
                

返回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"
                

返回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
                

将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
                

阻塞式列表弹出。

和lpop 类似 ,但是该命令是阻塞式,简单通俗的讲,就是在使用该命令之后,redis 会去指定的list 列表(多个)中,顺序弹出第一个非空列表的元素。 如果给定的所有list key 全部为空列表,则该命令会阻塞,直到有其它客户端对指定的key中的某个key 进行lpush (rpush)操作才会返回值。

返回结果为:第一个非空列表的元素加上该列表的key,而后面的timeout 则为阻塞时间,超过该时间,没有新的lpush(rpush)操作,则直接返回多个nil 的组合值,timeout 设置为0,则是无限期阻塞,直到有操作。

可用版本:>= 2.0.0
时间复杂度:O(1)

阻塞式列表弹出。

和rpop 类似 ,但是该命令是阻塞式,简单通俗的讲,就是在使用该命令之后,redis 会去指定的list 列表(多个)中,顺序弹出第一个非空列表的元素。 如果给定的所有list key 全部为空列表,则该命令会阻塞,直到有其它客户端对指定的key中的某个key 进行lpush (rpush)操作才会返回值。

返回结果为:第一个非空列表的元素加上该列表的key,而后面的timeout 则为阻塞时间,超过该时间,没有新的lpush(rpush)操作,则直接返回多个nil 的组合值,timeout 设置为0,则是无限期阻塞,直到有操作。

可用版本:>= 2.0.0
时间复杂度:O(1)

Copyright © 2019-2020 2024-04-24 04:00:38