【Redis】List类型的常用命令大全

这里的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 indexO(n),n 是索引的偏移量
求长度llen keyO(1)
左边删除lpop keyO(1)
右边删除rpop key
O(1)
指定删除lrem key count value
O(k),k 是元素个数
范围删除ltrim key start end
O(k),k 是元素个数
指定修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpop keyO(1)
阻塞操作brpop key
O(1)
2.命令使用解析

(1)lpush与rpush

这里的l与r分别表示left和right的意思,分别代表头插和尾插的意思

  • lpush

1)语法:lpush key element [element … ]

2)含义:将一个或者多个元素从左侧放入(头插)到list中(key不存在时,创建新的key;存在时,逐个头插)

3)时间复杂度:只插入⼀个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数

 

按顺序进行头插 

  • 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

  1. 这两个是带有阻塞操作的命令
  2. 可以同时等待多个key列表的元素,哪一个列表先有元素则先进行获取
  3. 也可以对同一个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,因此主要用来作为分频道阻塞消息队列模型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小娥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值