文章目录
- lpush 命令
- lrange 命令
- lpushx 命令
- rpush 命令
- rpushx 命令
- lpop 命令
- rpop 命令
- lindex 命令
- linsert 命令
- llen 命令
- lrem 命令
- ltrim 命令
- lset 命令
- blpop 和 brpop
lpush 命令
从左侧向列表中插入指定的元素
语法:lpush key value [value……]
时间复杂度:O(1)
返回值:成功插入元素的个数
注意:在插入时,如果该元素已经存在,则返回的个数也会将原列表中元素的个数加上新插入元素的个数,就算重复也会计算上。
操作演示:
lrange 命令
通过指定下标,获取指定范围内的元素
语法:lrange key start end
时间复杂度:O(k),k表示获取的元素的个数
返回值:指定范围内的元素
操作演示:
注意:因为它是从左边依次插入指定元素,所以,第一个元素就是8,获取的时候,也是从左边依次获取。
如果指定的下标越界了挥发会发生什么呢?
下面演示以下获取下标0-100的元素
注意:如果指定的下标越界,没有那么多的元素,那么,在获取的时候,列表中有多少个元素就返回多少个元素
lpushx 命令
在插入时,如果指定的key存在,则从左侧将一个或多个元素放到列表中,如果不存在,则插入失败
语法:lpushx key value [value….]
返回值:插入后,列表中元素的个数或者0,如果是0,表示插入失败
时间复杂度:O(1)
操作演示:
rpush 命令
从“右侧”向 list 中插入一个或多个元素,用法和 lpush 一样,只不过插入的方向不同
语法:rpush key value [value…….]
返回值:插入过后,list中元素的个数
时间复杂度:O(1)
操作演示:
rpushx 命令
如果指定的 key 存在,从“右侧”向 list 中插入一个或多个元素,如果不存在,则插入失败,和 lpushx 命令用法一样。
语法:rpushx key value [value……]
返回值:插入成功后,list 中元素的个数,如果插入失败,返回 0
时间复杂度:O(1)
操作演示:
lpop 命令
从 list 的左边删除一个元素
语法:lpop key [count],“count”表示指定删除元素的个数
返回值:删除的元素 或者 nil
时间复杂度:O(1)
操作演示:
rpop 命令
从 list 的右边删除一个元素
语法:rpop key [count],“count”表示指定删除元素的个数
返回值:删除的元素 或者 nil
时间复杂度:O(1)
操作演示:
所以,lpush、lpop、rpush、rpop 这四个命令搭配使用就可以构成 “栈” 或 “队列” 这两种数据结构
搭配使用 lpush和 lpop,就相当于栈
搭配使用 rpush 和 lpop,就相当于队列
lindex 命令
获取指定下标的值
**语法:**lindex key index
**返回值:**下标对应的值 或者 nil
**时间复杂度:**O(n)
操作演示:
注意:如果指定的下标越界,则返回 nil
linsert 命令
通过指定基准位置,在基准位置的前面或者后面插入元素
语法:linsert key berfore | after pivot value
before 表示在基准的前面插入
after 表示在基准的后面插入
pivot 表示基准,基准是列表中的某个值
返回值:插入成功后,元素的数量,或者是 -1
时间复杂度:O(n)
操作演示:
如果列表中存在多个相同的基准,在插入的时候会发生什么?
- 在列表中存在两个 2
- 指定 2 为基准,在基准的后面插入 6
可以看到,在寻找基准值时,是从列表的左边开始寻找,找第一个符合指定基准的位置。
如果指定基准位置在列表中不存在,则返回 -1
llen 命令
列表的长度
语法:llen key
返回值:列表长度 或者 0,如果key不存在,则返回0
时间复杂度:O(1)
操作演示:
lrem 命令
删除指定个数的元素
语法:lrem key count num
count 表示个数,要删除几个指定的元素,count有下列三种情况:
count > 0 从列表的左边开始删除,并删除count个
count < 0 从列表的右边开始删除,并删除count个
count = 0 删除列表中所有指定的元素
num 表示指定的元素
返回值:成功删除元素的个数
时间复杂度:O(n)
操作演示:
- 插入四组 1 2 3 4
- 删除元素 1
- count = 2
从左边删除,删除两个 1
- count = -2
从右边删除,删除两个 1
- count = 0
删除所有的元素 2
注意:如果指定的 count 个数大于列表中存在的元素个数,删除时,列表中有多少个元素就删多少个元素,如下图:
列表中有 4 个 3,但是,coung = 5,也可以成功删除
ltrim 命令
删除指定区间外的元素
语法:ltrim key start end
返回值:ok
时间复杂度:O(N),N表示要删除元素的个数
操作演示:
- 插入 1 2 3 4 5 6
- 删除指定区间[1,4] 之外的元素,也就是删除 1, 6
lset 命令
根据下标修改元素
语法:lset key index element
返回值:ok
时间复杂度:O(n)
操作演示:
注意:如果指定的下标不存在,则报出错误
blpop 和 brpop
-
如果 list 中存在元素,blpop、brpop 和 lpop、rpop 的作用一样。
-
如果 list 中没有元素,blpop、brpop 取元素时就会阻塞等待(类似于阻塞队列),同时也设置阻塞等待的时间,如果在超过等待时间之前,list 中有了元素,就直接弹出,如果等到超过这个最大等待时间,就不在进行等待,而且在等待的过程中,Redis 可以去执行其他的命令。
-
如果在 blpop、brpop 中指定多个key,那么会从左向右遍历键,一旦有一个键对应的列表中有元素,命令就立即返回。
-
如果多个客户端对同一个键执行 pop,则最先执行命令的客户端会得到弹出的元素
语法:blpop key [key……] timeout
注意:这里的timeout表示超时时间,单位是:秒(Redis 6之后,超时时间允许设定为小数)
返回值:元素值
时间复杂度:O(1)
操作演示:
(1) 针对一个非空列表操作
此时 key1 的列表里面有3个元素,使用 blpop 弹出元素时,当前 键 以及 键对应的值都会打印出来
(2)针对一个空列表操作
此时 key1 键为空,从 key1键 对应的列表中取元素并且设置等待时间为100秒
再开启一个客户端向 key1 里放入元素
此时,正在阻塞的这个客户端就可以立即拿到元素,并且打印出来等待了多长时间(29.36s)
(3) 指定多个不存在的 key,当其他的客户端向任何一个 key 中放入元素,另一个阻塞的客户端都会直接获取到
以上就是 blpop 的用法,brpop 的用法也是一摸一样的,这里就不再演示。