目录
list相当于c++的双端队列deque

区分获取和删除的区别
将一个或者多个元素从左侧放入(头插)到list中
语法:
LPUSH key element [element...]
时间复杂度:O(k),k是元素个数
返回值:插入后list的长度 。
如果key已经存在,并且key对应的value类型,不是list,此时lpush命令就要报错
在key存在时,将一个或者多个元素从左侧放入(头插)到list 中,不存在,则返回
语法:
LPUSHX key element [element...]
时间复杂度:O(1)
返回值:插入后list的长度 。
将一个或者多个元素从右侧放入(尾插)到list中
语法:
RPUSH key element [element...]
时间复杂度:O(k),k是元素个数
返回值:插入后list的长度
在key存在时,将一个或者多个元素从右侧侧放入(尾插)到list 中,不存在,则返回
语法:
RPUSHX key element [element...]
时间复杂度:O(1)
返回值:插入后list的长度 。
查看list中指定范围的元素
语法:
LRANGE key start stop //此处的区间是闭区间
时间复杂度:O(s+n),s是start的偏移量,n是start到stop
返回值:指定区间元素
从list左侧取出元素(即头删)
语法:
LPOP key
时间复杂度:O(1)
返回值:取出的元素或者nil
从list右侧取出元素(即尾删)
语法:
RPOP key
时间复杂度:O(1)
返回值:取出的元素或者nil
获取从左数第index位置的元素
语法:
LINDEX key index
时间复杂度:O(N),N是索引的偏移量
返回值:取出的元素或者nil(下标非法返回nil)
在特定位置插入元素
语法:
LINSERT key
pivot element
插入指定位置之前还是之后 - pivot 插入位置的基准值
- element 插入的值
- linsert进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的即可
时间复杂度:O(N),N是pivot距离头尾的距离
返回值:插入后list的长度

获取list长度
语法:
LLEN key
时间复杂度:O(1)
返回值:list的长度,不存在的key返回0
语法:
LREM key count element
- count 要删除的个数
- element 要删除的值
- count是正数从左开始找,负数是从右开始找,0代表符合删除的值的全删除
时间复杂度:O(N+M),N列表长度,M删除元素个数
返回值:删除的个数
语法:
LTRIM key start stop
- 保留start和stop之间区间内的元素(区间外面两边的元素就直接被删除了)
根据下标修改元素
语法:
LSET key index element
- index越界报错
时间复杂度:O(N),N索引的偏移量
blpop 和brpop是lpop和rpop的阻塞版本,和对应的非阻塞版本的作用基本一致,除了:
brpop的用法与效果与blpop类似,这里只介绍blpop
LPOP的阻塞版本
语法:
BLPOP key [key ...] timeout
- timeout单位是秒
时间复杂度:O(1)。
返回值:当针对一个非空的列表进行操作,返回的结果相当于一个pair,一方面告诉我们当前的数据来自哪个key,另一方面告诉我们取到的数据是啥。若列表为空等待timeout秒,若超过timeout的时间,则返回nil。

列表类型的内部编码有两种:
上面两种编码方式是旧版本的实现方式,现在一般使用quikelist,quikelist相当于链表和压缩列表的结合,整体还是一个链表,链表的每个元素是压缩列表,每个压缩列表都不让它太大(通过list-max-ziplist-size来配置)