手撕Redis五大基本数据类型之列表(List)

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 命令用于在列表中已存在的元素前或后插入元素。 相当于插入

  1. 当列表不存在时,被视为空列表,不执行任何操作。
  2. 当指定元素不存在于列表中时,不执行任何操作。
  3. 如果 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)

动动小手,点个关注呗。嘿嘿

在这里插入图片描述
十分感谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值