Redis 列表(List)命令
前言
因为List
列表类型和String
类型有所不同,所以讲解顺序和方法也会有所改变。在我们对列表命令进行预览的时候,我们发现,列表命令的首字母分别是:L、R和B。这三者分别代表了什么呢?简单来说,这三个命令分别是list、right和block的缩写。意味着,这些命令的操作顺序是从左开始,从右开始以及命令具有阻塞的。因为这个特性,我们对命令进行梳理的时候,会对这些特殊的“前缀”做大写处理。
考虑到对命令进行分门别类有利于记忆,以及由浅入深有利于理解。我们对列表命令进行的分类和处理。
基本分为下面几大类:
L代表List的命令
升级版命令
阻塞命令
基础命令
Llen
首先出场的是,简单的Llen
命令,见名知意,是List Len的缩写,马上就会明白这个命令是统计某key所对应的列表的长度。如果列表并不存在,则返回0.用法如下:Llen key
Lindex
Lindex根据索引获取列表中的元素,如果索引不在列表的区间范围,则返回空值(nil).是List Index的缩写。用法如下:Lindex key index
。
我们在了解了如何获取了列表中的某个元素,我们应该如果获取列表中某个区间,甚至是全部元素呢?下面,就该Lrange
出场了。
Lrange
Lrange同样也是根据索引获取列表中的元素,是List Range的缩写。但是请注意,Lrange是通过start和end两个索引来获取两个索引中的全部元素的,其返回值还是一个列表,即原列表的子列表。用法:Lrange key start end
。如果想获取全部元素,只需要将start和end分别设置为0*和-1*即可。
当我们想在某个位置插入元素的时候,Redis为我们提供了很多命令,我们首先介绍Linsert
,因为它只出现在L分组中,而且简单。
Linsert
是List Insert的缩写。Linsert是在列表中的某个元素后插入一个元素。用法:Linsert key [before|after] name value
请注意几点:
- 必须是列表,否则报错
- name在列表中必须存在,否则返回0,对列表不进行操作
- 操作成功后,返回列表长度
当我们需要修改列表中某个位置上的元素的时候,我们就需要使用Lset
命令了。
Lset
是List Set的缩写Lset根据索引,将列表中索引位置的元素设置为新值。Lset key index value
。如果索引超过范围或者列表为空列表,则会返回一个错误。
Lrem
是List Remove的缩写,意为从列表中删除元素。其命令为:Lrem key count value
。命令的解读为,从key的列表中删除count个值为value的元素,并返回被移除元素的数量。其中,需要注意的一点是count的取值,count的大小为要删除的元素的个数,其正负性为从列表中开始查找的方向:
- 正值: 从列表首向尾查找
- 负值:从列表尾向首查找
- 0:全部删除
需要了解到,虽然返回值为移除元素的数量,而count是期望删除的数量,但这两者并不一定相等,不相等的情况,一般有:
- 列表中不存在和value相等的元素,返回值总为 0
- 期望删除的元素个数比列表中存在的元素个数多
- 期望参数值为0,且元素存在于列表中
Ltrim
是List Trim的缩写,意为只保留列表中的区间元素,将其它部分删除。其命令为:Ltrim key start end
。
Lpush
是List Push的缩写,意为将一个或者多个元素插入到列表头部。其命令为:Lpush key value1 ... valueN
.如果key不存在,则创建一个空列表,并执行Lpush操作。返回值为 操作完成后,列表的长度。
Rpush
是list Rigit Push的缩写,这里将list省略了。命令和*Lpush相似,只是元素的插入位置不再是列表头部,而是在列表尾部,即列表的最右边*(right)。其命令为:Rpush key value1 … valueN
。
Lpop
是List Pop的缩写,意为取出列表中的第一个元素,其返回值为 列表的第一个元素。其命令为:Lpop key
Rpop
是list Right Pop的缩写,意为取出列表中的最后一个(最右边第一个)元素,其返回值为 列表最后一个元素。其命令为:Rpop key
.
升级版命令
Lpushx
是List Push if eXist的缩写,是Lpush 的升级版,意为只有当列表存在时候才会执行操作。语法和Lpush一样:Lpushx key value1 … valueN
。与Lpush的区别:
- Lpush 当列表不存在的时候,创建空列表,然后执行Lpush操作
- Lpushx当列表不存在的时候,不执行操作
Rpushx
是List Right Push if eXists的缩写,同样是Rpush的升级版。是Lpushx对应的从列表尾插入的方法。其命令为:Rpushx key value1 … valueN
。
Rpoplpush
是List Right Pop List Push的缩写,意为从列表尾部取出一个元素,并添加到另一个列表的头部。其命令为Rpoplpush source destation
;返回值为移动的元素。
当source和destation为同一个key值时,相当于将一个元素从列表尾部移动到列表头部。
含有(B)阻塞的命令
BLpop,BRpop,BRpopLpush
分别是Block List Pop、Block list Right Pop和“Block Right list Pop List Push的缩写。为Lpop、Rpop和RpopLpush的可阻塞版。以BLpop为例,其命令为:BLpop List1 List2 … ListN timeout
。Redis 会从尝试从所列的列表中弹出其中存在的第一元素,如果没有元素可以弹出,则会阻塞列表,直到有元素可以弹出。或者超时。
其中,阻塞列表需要满足所列的列表中,任何列表中此时都没有元素。
阻塞停止的条件满足下面任何一个即可:
- 超时
- 有操作向所列的列表中添加了元素,使得所列的列表中有元素可以弹出
返回值:
- 超时: nil
- 非超时:一个含有2个元素的列表
- 被弹出元素所属的 key
- 被弹出元素的值
BRpop的命令:BRpop List1 List2 … ListN timeout
。返回值:同BLpop
BRpopLpush的命令:BRpopLpush source destation timeout
。返回值:
- 超时: nil
- 非超时:一个含有2个元素的列表
- 被弹出的元素的值
- 等待时长
总结
我们可以从数据的增,删,改,查对List命令进行一下分类:
增 | 删 | 改 | 查 | 其它 |
---|---|---|---|---|
Lpush | LPop | Lset | Lindex | BRpopLpush |
Rpush | RPop | Lrange | RpopLpush | |
Lpushx | BLpop | Llen | ||
Linsert | BRPop | |||
Rpushx | Lrem | |||
Ltrim | ||||
通过上边的讲解和最后的分类汇总,我相信,大部分人已经对 Redis 的List有了初步的了解。下一篇文章,我们会对Set集合或者对key命令做一定的简单了解。欢迎大家指导。