list的实现并非一个简单的数组,而是个接近于"双端队列"(std::deque)
列表中的元素是有序的,这里的有序不是指的"顺序",而是指的,因顺序变更得到的结果与变更之前是不等价的
列表中元素是可以重复的,hash中元素是不以重复的,意思是一个列表中可以有多个相同的值
LPUSH
对列表进行头插
操作格式:
lpush key element element...
返回值:
插入后list的长度
时间复杂度:
O(1)
举个例子:
cpp
lpush key1 element1 element2 element3
LRANGE
获取从strent到end区间所有的元素,左闭右闭,下标支持负数
操作格式:
lange key start end
举个例子:
cpp
lpush key1 element1 element2 element3
//获取还列表上的全部数据
lrange key 0 -1
如果取的数值越界了怎么办?
redis的做法,是直接尽可能的获取给定区间元素,如果给定区间越界,就会尽可能的获取对应内容
LPUSHX
如果key存在则完成头插操作,如果key不存在,则返回空,与EX特性比较相似
返回值:
插入后list的长度
时间复杂度:
O(1)
RPUSH/RPUSHX
X--->exists
与LPUSH/LPUSHX一样
LPOP
头删
操作格式:
lpop key count
在redis6.2版本,新增的count属性,原先是没有的,表示一次删除几个元素举个例子:
返回值:
删除的元素,或者为nil
时间复杂度:
O(1)
举个例子:
cpp
lpush key1 element1 element2 element3
lpop key1 3
RPOP
尾删
操作格式:
rpop key count
注意:
在redis6.2版本,新增的count属性,原先是没有的,表示一次删除几个元素举个例子:
cpp
rpush key1 element1 element2 element3
rpop key1 3
LINDEX
获取从左数第index位置的元素
操作格式:
lindex key index
返回值:
取出的元素或者nil
时间复杂度:
O(N),N为删除元素的个数,效率上一般情况下可以理解为O(1)
举个例子:
cpp
lpush key element1 element2 element3 element4 element5
//取下标为前5的元素,并不拿第5个元素,这里的5可以理解为,拿前5个元素
lindex key1 5
LINSERT
进行任意位置的插入
操作格式:
linsert key <beffore | after> pivot element
pivot:在什么位置插入
<beffore | after>:在该位置的前或者后插入
举个例子:
cpp
linsert key before 4 100
返回值:
list新长度
万一插入的列表中,基准值存在多个怎么办?
linsert进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个复合基准值的位置即可
时间复杂度:
O(N),因为需要遍历列表,N表示列表的长度
LLEN
获取list的长度
操作格式:
llen key
返回值:
list的长度,若该key不存在,长度返回0
时间复杂度:
O(1)
LREM
rem--->remove
删除多个相同元素的值
操作格式:
lrem key count element
时间复杂度:
O(N + M),N是元素个数,M是你要删除的个数,可以理解为O(N)
count > 0,含义为从左往右找
count < 0,含义为从右往左找
count = 0,含义为element的全部元素
举个例子:
cpp
rpush key1 1234
lrem key1 -1 2
LTRM
保留start到end之间的元素,区间外的全部被删除
操作格式:
ltrem key start end
时间复杂度:
O(N)
举个例子:
cpp
lpush key1 1 2 3 4 5
ltrem key 2 5
LSET
根据下标,修改元素
操作格式:
lset key index element
时间复杂度:
O(N)
举个例子:
cpp
lset key1 0 3
lset插入越界值的话会报错
阻塞版本命令
BLPOP/BRPOP
在list中有元素的时候,与lpop/rpop并无区别,但是在没有元素的时候,会进行阻塞等待,在等待期间redis可以执行其他命令,同时可以设置阻塞时间,不需要进行无休止的等待
blpop/brpop都是可以同时去尝试删除多个key列表上的元素,多个key对应多个list,这么多个list哪个有元素了,执行删除,立刻返回,并不是将所有的key都删除一遍,而是多个中成功删除一次就行
返回值:
被删除的元素
操作格式:
blpop/brpop keykey... timeout
timeout:单位是秒,redis6中单位允许设置成小数,redis5中时间只能设置成整数
举个例子:
cpp
lpush key 1 2 3 4 5
bloop key 10
该组命令主要用途是做"消息队列"
list内部编码
在早些版本list的内部编码为
ziplist:
当存储内容长度小于配置的长度字节数,默认64字节,且元素个数也小于配置长度,默认为512个元素时选用ziplist作为list的内部编码
原因:
要求内容元素长度较短的原因是,因为会对内容进行压缩,那么就一定涉及到解压缩,内容过长就意味着解压缩时间过长,就会影响效率,所以在这时还不容不进行压缩使用linklist效率高
元素少就更好理解了,元素数量过多,就意味着遍历到目标元素的时间越长,进而影响效率
linkedlist
正常的链表格式
现在使用的编码格式quicklist
quicklist相当于链表和压缩链表的结合,整体还是一个链表,链表的每个节点是一个压缩列表
list应用场景

2.使用list做消息队列

3.可以实现栈,队列
