这里的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,因此主要用来作为分频道阻塞消息队列模型










![【题解】【模拟】—— [NOIP2013 普及组] 表达式求值](https://i-blog.csdnimg.cn/direct/f782c1acde024adb925001c00e7952f4.jpeg#pic_center)








