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

发布于:2024-10-12 ⋅ 阅读:(128) ⋅ 点赞:(0)

这里的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;存在时,逐个头插)

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


网站公告

今日签到

点亮在社区的每一天
去签到