1、List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。集合成员是**不唯一的,**这就意味着集合中能出现重复的数据。
它的底层实际是个双向链表
,对两端的操作性能很高,通过索引下标来操作中间的节点性能会较差。
2、基本命令
所有List命令都是以L开头
2.1、lpush命令
Lpush 命令用于将一个或多个值插入到列表头部
。 如果 key 不存在,则会创建一个空列表并执行 Lpush 命令。 如果key 存在但不是列表类型时,返回一个错误。
具体语法
lpush key value [value ...]
注
- 插入的值在表头
- 如果 key 不存在,则会创建一个空列表并执行 Lpush 命令。 如果key 存在但不是列表类型时,返回一个错误。
- 在Redis 2.4版本以前的lpush命令,都只接受单个 value 值。
案例
#设置此时存在的key
127.0.0.1:6379> mset k1 v1 k2 itbestboy
OK
#查看此时存在的key
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
#插入的key不存在
127.0.0.1:6379> lpush l1 v1 v2 v3
(integer) 3 #插入成功
#插入的key存在,但是不是列表类型
#1.0 查看k1的类型
127.0.0.1:6379> type k1
string
#2.0 插入
127.0.0.1:6379> lpush k1 v1 v2 v3
(error) WRONGTYPE Operation against a key holding the wrong kind of value #插入失败
#插入的key存在,而且是列表类型
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lpush l1 v1 v2 v3 v4
(integer) 7
127.0.0.1:6379> lrange l1 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
5) "v3"
6) "v2"
7) "v1"
#可以看出插入后直接追加,且允许出现重复的元素
2.2、lpushx命令
Lpushx命令用于 将一个或多个值插入到已存在
的列表头部,列表不存在时操作无效。
注意和lpush命令加以区分:
lpush命令在列表是否存在时都可以进行插入,只有当已存在的key对应的value的类型不是列表类型时才会插入失败,否则一般不会失败,但是lpushx在能在列表存在时才能插入,当列表不存在时不能插入==
具体语法
lpushx key value
注意:只有列表已经存在时才会有效,否则无效。且一次只能插入一个值。
案例
#在不存在的列表中插入值
127.0.0.1:6379> lpushx l2 v2
(integer) 0 #插入失败
#在已存在的列表中插入值
127.0.0.1:6379> lpushx l1 v8
(integer) 11
127.0.0.1:6379> lrange l1 0 -1
1) "v8"
2) "v7"
3) "v6"
4) "v5"
5) "v4"
6) "v3"
7) "v2"
8) "v1"
9) "v3"
10) "v2"
11) "v1"
2.3、lrange命令
Lrange 命令用于获取列表中指定区间内
的元素, 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
具体语法
lrange key start stop
说明
- key:指定的列表名
- start:开始位置,不可以省略。0表示第一个元素,以此类推
- end:结束位置,不可以省略。-1表示最后一个元素,以此类推
案例
#获取列表l2(不存在)的所有元素
127.0.0.1:6379> lrange l2 0 -1
(empty list or set)
#获取列表l1中所有元素
127.0.0.1:6379> lrange l1 0 -1
1) "v8"
2) "v7"
3) "v6"
4) "v5"
5) "v4"
6) "v3"
7) "v2"
8) "v1"
9) "v3"
10) "v2"
11) "v1"
#获取列表l1中第1到第4个元素
127.0.0.1:6379> lrange l1 0 3
1) "v8"
2) "v7"
3) "v6"
4) "v5"
2.4、lindex命令
Lindex 命令用于通过索引获取列表中指定位置
的元素。当所给的索引值超出索引范围时,报错
具体语法
lindex key index
注
- key:指定的列表,如果不存在会报nil
- index:索引值,一般从0开始,表示第一个元素,也可以使用负数,-1表示最后一个元素,依次类推。
案例
#查看列表l1中的元素位置
127.0.0.1:6379> lrange l1 0 -1
1) "v8"
2) "v7"
3) "v6"
4) "v5"
5) "v4"
6) "v3"
7) "v2"
8) "v1"
9) "v3"
10) "v2"
11) "v1"
#当列表不存在时
127.0.0.1:6379> lindex l2 0
(nil)
127.0.0.1:6379> lindex l2 3
(nil)
#获取l1列表中的第一个元素
127.0.0.1:6379> lindex l1 0
"v8"
#获取l1列表中的最后一个元素
127.0.0.1:6379> lindex l1 -1
"v1“
#获取l1列表中的倒数第三个元素
127.0.0.1:6379> lindex l1 -3
"v3"
#获取超过l1下标值的元素
127.0.0.1:6379> lindex l1 11
(nil)
注
lrange 用于获取指定范围的元素。
lindex 用于获取指定位置的元素。
2.5、rpush命令
rpush 命令用于将一个或多个值插入到列表尾部
。 如果 key 不存在,则会创建一个空列表并执行 rpush 命令。 如果key 存在但不是列表类型时,返回一个错误。
具体语法
rpush key value [value ...]
注
- 插入的值在表尾
- 如果 key 不存在,则会创建一个空列表并执行 rpush 命令。 如果key 存在但不是列表类型时,返回一个错误。
- 在Redis 2.4版本以前的rpush命令,都只接受单个 value 值。
案例
#插入的key不存在
127.0.0.1:6379> rpush l2 v1 v2 v3
(integer) 3 #插入成功
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v3"
#插入的key存在,但是不是列表类型
#1.0 查看k1的类型
127.0.0.1:6379> type k1
string
#2.0 插入
127.0.0.1:6379> rpush k1 v2 v3 v4 v5 v6
(error) WRONGTYPE Operation against a key holding the wrong kind of value #插入失败
#插入的key存在,而且是列表类型
127.0.0.1:6379> rpush l2 v2 v3 v4 v5 v6
(integer) 8 #插入成功
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v2"
5) "v3"
6) "v4"
7) "v5"
8) "v6"
#可以看出插入后直接追加,且允许出现重复的元素
2.6、rpushx命令
rpushx命令用于 将一个或多个值插入到已存在
的列表尾部,列表不存在时操作无效。
注意和rpush命令加以区分:
1.rpush命令在列表是否存在时都可以进行插入,只有当已存在的key对应的value的类型不是列表类型时才会插入失败,否则一般不会失败,但是rpushx在能在列表存在时才能插入,当列表不存在时不能插入
2.rpush命令一次可以插入多个值,而rpushx一次只能插入一个值
==
具体语法
rpushx key value
注意:只有列表已经存在时才会有效,否则无效。且一次只能插入一个值,如果需要插入多个值时可以借助{}
实现
案例
#在不存在的列表中插入值
127.0.0.1:6379> rpushx l3 v2
(integer) 0 #插入失败
#在已存在的列表中插入值
127.0.0.1:6379> rpushx l2 v7
(integer) 9
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v2"
5) "v3"
6) "v4"
7) "v5"
8) "v6"
9) "v7
2.7、linsert命令
linsert 命令用于在列表中已存在的元素前或后插入元素。 相当于插入
- 当列表不存在时,被视为空列表,不执行任何操作。
- 当指定元素不存在于列表中时,不执行任何操作。
- 如果 key 不是列表类型,返回一个错误。
具体语法
linsert key BEFORE|AFTER pivot value
说明
- key:为指定的元素,如果不存在,则不做任何操作
- BEFORE|AFTER:在指定key对应元素的前后位置。
- pivot:第几个位置
- value:指定key对应的值
#在l3列表(列表不存在)中插入元素
127.0.0.1:6379> linsert l3 before 2 l1
(integer) 0 #插入失败,不做任何处理
#在k2(类型比匹配)中插入元素
127.0.0.1:6379> linsert k2 before 2 l1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#在l2列表中v10对应的元素后增加一个元素
127.0.0.1:6379> linsert l2 after v10 v11
(integer) -1
#在l2列表中v3对应的元素后增加一个元素
127.0.0.1:6379> linsert l2 after v3 v10
(integer) 11
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v10"
5) "v2"
6) "v3"
7) "v4"
8) "v5"
9) "v6"
10) "v7"
11) "{v7,v8}"
#在l2列表中v3对应的元素前增加一个元素
127.0.0.1:6379> linsert l2 before v3 v10
(integer) 12
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v10"
4) "v3"
5) "v10"
6) "v2"
7) "v3"
8) "v4"
9) "v5"
10) "v6"
11) "v7"
12) "{v7,v8}"
2.8、lset命令
lset 通过索引来设置元素的值,相当于更新操作
。当索引参数超出范围,或对一个空列表进行 lset 时,返回一个错误。
具体语法
lset key index value
说明
- key:指定的列表,如果不存在报错
- index:下标。一般从0开始,表示第一个元素,也可以使用负数,-1表示最后一个元素,依次类推
- value:添加的值
案例
#列表不存在
127.0.0.1:6379> lset l3 0 v1
(error) ERR no such key
#类型不匹配
127.0.0.1:6379> lset k1 0 v1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#索引值超出范围
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v10"
4) "v3"
5) "v10"
6) "v2"
7) "v3"
8) "v4"
9) "v5"
10) "v6"
11) "v7"
12) "{v7,v8}"
127.0.0.1:6379> lset l2 12 v12
(error) ERR index out of range
#在l2列表中将最后一个元素修改为v11
127.0.0.1:6379> lset l2 11 v11 #等价于 lset l2 -1 v11
OK
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v10"
4) "v3"
5) "v10"
6) "v2"
7) "v3"
8) "v4"
9) "v5"
10) "v6"
11) "v7"
12) "v11"
127.0.0.1:6379>
2.9、llen命令
Llen 命令用于返回列表的长度。 如果列表 key 不存在,则返回 0 。 如果 key 不是列表类型,返回一个错误。
具体语法
llen key
案例
#获取不存在的列表的长度
127.0.0.1:6379> llen l3
(integer) 0
#获取不是列表类型的长度
127.0.0.1:6379> llen k1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#获取l2列表的长度
127.0.0.1:6379> llen l2
(integer) 12
2.10、ltrim命令
ltrim 命令用于对一个列表进行修剪(trim),即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
具体语法
ltrim key start stop
说明
-
key:指定的列表
-
start:开始位置
-
stop:结束位置
下标一般从0开始,表示第一个元素,也可以使用负数,-1表示最后一个元素,依次类推
案例
#查看已存在的key
127.0.0.1:6379> keys *
1) "l2"
2) "l1"
3) "k1"
4) "k2"
#列表不存在
127.0.0.1:6379> ltrim l3 0 -1
OK
#类型不符合
127.0.0.1:6379> ltrim k1 0 -1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#位置越界
127.0.0.1:6379> lrange l2 0 -1
1) "v1"
2) "v2"
3) "v10"
4) "v3"
5) "v10"
6) "v2"
7) "v3"
8) "v4"
9) "v5"
10) "v6"
11) "v7"
12) "v12"
127.0.0.1:6379> ltrim l2 12 14
OK
127.0.0.1:6379> lrange l2 0 -1
(empty list or set) #此时列表变为空列表
#正常
127.0.0.1:6379> lpush l2 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> lrange l2 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> ltrim l2 0 2
OK
127.0.0.1:6379> lrange l2 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379>
2.11、lrem命令
lrem命令用于移除列表中的元素。根据参数 count 的值,移除列表中与参数 VALUE 相等的元素.
具体语法
lrem key count value
注
Lrem 根据参数 count 的值,移除列表中与参数 VALUE 相等的元素。
count 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
- count
< 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
- count = 0 : 移除表中所有与 VALUE 相等的值。
案例
#列表不存在
127.0.0.1:6379> lrem l3 1 v1
(integer) 0
#类型不匹配
127.0.0.1:6379> lrem k1 1 v1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#查看列表l2中的值
127.0.0.1:6379> lrange l2 0 -1
1) "v5"
2) "v5"
3) "v5"
4) "v5"
5) "v4"
6) "v3"
7) "v2"
8) "v2"
9) "v4"
10) "v3"
11) "v2"
#移除不存在的值
127.0.0.1:6379> lrem l2 2 v1
(integer) 0
#从表头到表尾移除2个v2
127.0.0.1:6379> lrem l2 2 v2
(integer) 2
127.0.0.1:6379> lrange l2 0 -1
1) "v5"
2) "v5"
3) "v5"
4) "v5"
5) "v4"
6) "v3"
7) "v4"
8) "v3"
9) "v2"
#当剩余一个v2时,继续移除2个v2,没有报错
127.0.0.1:6379> lrem l2 2 v2
(integer) 1
127.0.0.1:6379> lrange l2 0 -1
1) "v5"
2) "v5"
3) "v5"
4) "v5"
5) "v4"
6) "v3"
7) "v4"
8) "v3"
#从表尾到表头移除2个v3
127.0.0.1:6379> lrem l2 -2 v3
(integer) 2
127.0.0.1:6379> lrange l2 0 -1
1) "v5"
2) "v5"
3) "v5"
4) "v5"
5) "v4"
6) "v4"
#移除所有v5
127.0.0.1:6379> lrem l2 0 v5
(integer) 4
127.0.0.1:6379> lrange l2 0 -1
1) "v4"
2) "v4"
2.12、lpop命令
Lpop 命令用于删除表头中的第一个元素,并返回删除的元素,当列表为空时,返回nil。
单个元素删除,如果需要删除整个列表中的元素,或者删除列表,需要递归删除。
具体语法
lpop key
案例
#查看存在的key-value
127.0.0.1:6379> keys *
1) "l2"
2) "l1"
#查看l1中的value
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "v2"
3) "v1"
#删除不存在的列表
127.0.0.1:6379> lpop l3
(nil)
#当列表中的元素为空时,继续删除
127.0.0.1:6379> lpop l1
(nil) #此时会返回nil,并且删除对应的列表
#正常删除
127.0.0.1:6379> lpop l1
"v3"
127.0.0.1:6379> lpop l1
"v2"
127.0.0.1:6379> lpop l1
"v1"
2.13、rpop命令
rpop 命令用于删除表尾中的第一个元素,并返回删除的元素,当列表为空时,返回nil。
单个元素删除,如果需要删除整个列表中的元素,或者删除列表,需要递归删除。
具体语法
rpop key
案例
#查看l1中的value
127.0.0.1:6379> lrange l1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
#删除不存在的列表
127.0.0.1:6379> rpop l3
(nil)
#正常删除
127.0.0.1:6379> rpop l1
"v4"
127.0.0.1:6379> rpop l1
"v3"
127.0.0.1:6379> rpop l1
"v2"
127.0.0.1:6379> rpop l1
"v1"
#当列表中的元素为空时,继续删除
127.0.0.1:6379> rpop l1
(nil) #此时会返回nil,并且删除对应的列表
2.14、blpop命令
blpop命令用于删除表头中的第一个元素,并返回删除的元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.
单个元素删除,如果需要删除所有元素,或者删除列表,需要递归删除
具体语法
blpop key [key ...] timeout
说明
- key:指定的元素,如果列表不存在,则先进入阻塞队列,等待超时,超时后会返回nil和时间
- timeout:超市时间,单位是s
案例
#删除不存在的列表
127.0.0.1:6379> blpop l3 5
(nil)
(5.07s)
#正常删除
127.0.0.1:6379> blpop l1 6
1) "l1"
2) "v4"
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> blpop l1 6
1) "l1"
2) "v3"
127.0.0.1:6379> lrange l1 0 -1
1) "v2"
2) "v1"
127.0.0.1:6379> blpop l1 6
1) "l1"
2) "v2"
127.0.0.1:6379> blpop l1 6
1) "l1"
2) "v1"
#当列表中的元素删除完毕后,继续删除会返回nil
127.0.0.1:6379> blpop l1 6
(nil)
(6.06s)
注:在设置的超市时间内如果有则正常删除,如果不存在元素就会进入阻塞状态,当在超市时间内写入元素,此时就会被重新唤醒,删除元素。
2.15、brpop命令
brpop命令用于删除表尾中的第一个元素,并返回删除的元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.
单个元素删除,如果需要删除所有元素,或者删除列表,需要递归删除
具体语法
brpop key [key ...] timeout
说明
- key:指定的元素,如果列表不存在,则先进入阻塞队列,等待超时,超时后会返回nil和时间
- timeout:超市时间,单位是s
案例
#删除不存在的列表
127.0.0.1:6379> rlpop l3 5
(nil)
(5.07s)
#正常删除
127.0.0.1:6379> lrange l1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> brpop l3 6
(nil)
(6.05s)
127.0.0.1:6379> brpop l1 6
1) "l1"
2) "v4"
127.0.0.1:6379> brpop l1 6
1) "l1"
2) "v3"
127.0.0.1:6379> brpop l1 6
1) "l1"
2) "v2"
127.0.0.1:6379> brpop l1 6
1) "l1"
2) "v1"
#当列表中的元素删除完毕后,继续删除会返回nil
127.0.0.1:6379> rlpop l1 6
(nil)
(6.06s)
#当时如果此时能在这6s内写入元素,此时会正常删除,即在设置的超市时间内如果有则正常删除,如果不存在元素就会进入阻塞状态,当在超市时间内写入元素,此时就会被重新唤醒,删除元素。
127.0.0.1:6379> lpush l1 v5
(integer) 1
127.0.0.1:6379> brpop l1 6
1) "l1"
2) "v5"
(3.10s)
注:在设置的超市时间内如果有则正常删除,如果不存在元素就会进入阻塞状态,当在超市时间内写入元素,此时就会被重新唤醒,删除元素。
2.16、brpoplpush命令
Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长, 反之则会返回元素。
具体语法
brpoplpush source destination timeout
说明
- source:源列表
- destination:目的列表
- timeout:超时时间
案例
127.0.0.1:6379> keys *
1) "l1"
2) "l2"
127.0.0.1:6379> lrange l1 0 -1
1) "v1"
2) "v2"
127.0.0.1:6379> lrange l2 0 -1
1) "v2"
2) "v1"
#正常
127.0.0.1:6379> brpoplpush l1 l2 3
"v2"
#可以看出此时l1列表中只剩一个元素,l2列表中增加一个元素,此操作相当于mv
127.0.0.1:6379> lrange l2 0 -1
1) "v2"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange l1 0 -1
1) "v1"
#如果目的列表不存在,则会创建
127.0.0.1:6379> brpoplpush l2 l3 3
"v1"
127.0.0.1:6379> keys *
1) "l3"
2) "l1"
3) "l2"
#如果源列表不存在,会返回nil
127.0.0.1:6379> brpoplpush l4 l3 3
(nil)
(3.07s)
rpoplpush
命令类似与brpoplpush,只不过没有超时时间,其余类似。
2.17、del命令
del命令用于删除整个列表,如果删除的列表不存在,则会提示。
具体语法
del key [key ...]
案例
#查看已经存在的
127.0.0.1:6379> keys *
1) "l1"
2) "l2"
#删除不存在的列表
127.0.0.1:6379> del l3
(integer) 0
#删除存在的列表
127.0.0.1:6379> del l1 l2
(integer) 2
127.0.0.1:6379> keys *
(empty list or set)
动动小手,点个关注呗。嘿嘿
十分感谢!