这里的list列表相当于一个双端队列,也可以认为是双向链表,也可以认为是数组,后续的很多命令都使用到下标。
list的特点:
- list中的每个元素也都是String类型
- 里面的元素可以重复
- 列表中的元素是有序的,如果里面元素顺序进行调换就不是原来的List
1.常用命令大全
以下命令,l和r组成的相对命令,分别表示left和right的意思。如果是l单独存在,则说明是list的意思。区间范围都是闭区间,并且坚持负数下标。
操作类型 | 命令 | 时间复杂度 |
---|---|---|
左边添加 | lpush key value [value … ] |
O(k),k 是元素个数
|
右边添加 | rpush key value [value … ] |
O(k),k 是元素个数
|
指定位置添加 | linsert key before | after pivot value |
O(n),n是pivot距离头尾的距离
|
范围查找 | lrange key start end |
O(s+n),s是start偏移量,
n是start到end的范围
|
下标查找 | lindex key index | O(n),n 是索引的偏移量 |
求长度 | llen key | O(1) |
左边删除 | lpop key | O(1) |
右边删除 | rpop key |
O(1)
|
指定删除 | lrem key count value |
O(k),k 是元素个数
|
范围删除 | ltrim key start end |
O(k),k 是元素个数
|
指定修改 | lset key index value | O(n),n 是索引的偏移量 |
阻塞操作 | blpop key | O(1) |
阻塞操作 | brpop key |
O(1)
|
2.命令使用解析
(1)lpush与rpush
这里的l与r分别表示left和right的意思,分别代表头插和尾插的意思
- lpush
1)语法:lpush key element [element … ]
2)含义:将一个或者多个元素从左侧放入(头插)到list中(key不存在时,创建新的key;存在时,逐个头插)
按顺序进行头插
- lpushx
1)语法:lpushnx key element [element … ]
2)含义:lpush的进化版,若key不存在时直接返回,key存在时才进行头插操作
3)时间复杂度:只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数
- rpush
1)语法:rpush key element [element … ]
2)含义:将一个或者多个元素从右侧放入(尾插)到list中,
3)时间复杂度:只插入一个元素为O(1),插入多个元素为O(N),N为插入元素个数
逐个进行尾插
- rpushx
1)语法:lpushnx key element [element … ]
2)含义:rpush的进化版,若key不存在时直接返回,key存在时才进行头插操作
3)时间复杂度:只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数
(2)lrange
1)语法:lrange key start stop
2)含义:获取区间范围[start,stop]内的所有元素,支持负数下标
3)时间复杂度:O(N)
范围[0,-1]表示整个list
如果范围超过list范围,会尽量返回。比如list长度为10,当求0-100时,就会返回0-10范围的元素。
(3)lpop与rpop
- lpop
1)语法:lpop key
2)含义:从list左侧取出元素(头删),并且拿到值,类似队列的弹出元素;list为空返回nil
3)时间复杂度:O(1)
把list最左侧元素删除并且获得该值
- rpop
1)语法:rpop key
2)含义:从list右侧取出元素(尾删),并且拿到值,类似队列的弹出元素;list为空返回nil
3)时间复杂度:O(1)
(4)lindex
1)语法:lindex key index
2)含义:从左侧开始数起,获取第index位置的元素
3)时间复杂度:O(N),N是起始位置的偏移量
4)返回值:插入后list的长度
下标从0位置开始,下标不符合则返回nil
(5)linsert
1)语法:linsert key <before | after> pivot element
2)含义:在特定位置插入元素(before和after必须二选一)。pivot是基准元素,不是下标
3)时间复杂度:O(N)
4)返回值:插入后list的长度
(6)llen
1)语法:llen key
2)含义:获取key对应list的长度
3)时间复杂度:O(1)
(7)lrem
rem属于remove的缩写
1)语法:lrem key count value
2)含义:删除count个value元素,直到删除完为止
3)时间复杂度:O(k),K为删除元素个数
count三个取值代表不同的意思
- >0,从左到右删除count个值为value的元素
- <0,从右到左删除count个值为value的元素
- =0,删除所有值为value的元素
(8)ltrim
1)语法:ltrim key start end
2)含义:保留范围[start,end]的元素,删除范围外的所有元素
3)时间复杂度:O(k),k是元素个数
(9)lset
1)语法:lset key index element
2)含义:根据下标修改元素。index为下标,element为修改后的元素
3)时间复杂度:O(n),n是索引的偏移量
(10)blpop与brpop
- 这两个是带有阻塞操作的命令
- 可以同时等待多个key列表的元素,哪一个列表先有元素则先进行获取
- 也可以对同一个list进行多个pop操作
主要介绍blpop,剩下的一样
- blpop
1)语法:blpop key [key2 … ] timeout
2)含义:带有阻塞效果的头删操作。当list为null时阻塞等待,也可以指定等待时间
3)时间复杂度:O(1)
4)返回值:返回二元组,一个表示来自哪一个key,一个表示删掉的值
操作非空列表:和lpop一样
操作空的列表:这个时候会阻塞等待超时时间,直接列表有元素或者时间过期
同时等待多个key:
- brpop
1)语法:brpop key
2)含义:带有阻塞效果的尾删操作。当list为null时阻塞等待,也可以指定等待时间
3)时间复杂度:O(1)
3.编码方式与应用场景
(1)list内部编码方式
现在list主要采取quicklist的编码方式,也就是结合了ziplist和linkedlist两种。
整体是一个linkedlist,链表的每个节点采用ziplist的方式
(2)应用场景
list中带有两个阻塞命令blpop与brpop,因此主要用来作为分频道阻塞消息队列模型