redis-列表

一个列表可以包含一个或以上数量的项,每个项按照它们被推入到列表的位置来排列。每个列表项所处的位置决定了这个项的索引值,索引以0为开始,从列表的左端到右端依次递增,位于列表最左端的项的索引为0,而位于列表最右端的项的索引为N-1,其中N为列表的长度。列表包含的项是可以出现重读,它们不必是唯一的。

一、推入和弹出操作

1.从列表的左端推入值

LPUSH key value [value...]

将一个或以上数量的值依次推入到列表的左端,命令返回新值被推入之后,列表目前包含的项数量。复杂度为O(N),其中N为被推入值的数量。

2.从列表的左端推入多个值

如果执行LPUSH命令时给定了多个值,那么各个值将按照给定时的顺序,从左到右依次地被推入到列表的左端。

3.从列表的右端推入值

RPUSH key value [value...]

将一个或以上数量的值依次推入到列表的右端,命令返回新值被推入之后,列表目前包含的项数量。复杂度为O(N),其中N为被推入值的数量,如果只推入一个值,那么命令的复杂度为O(1)。

4.从列表的右端推入多个值

如果执行RPUSH命令给定了多个值,那么各个值将按照给定时的顺序,从左到右依次地被推入到列表的右端。

二、从列表的两端弹出项

命令作用复杂度
LPOP key移除并返回列表最左端的项O(1)
RPOP key移除并返回列表最右端的项O(1)

三、长度、索引和范围操作

1.获取列表的长度

LLEN key

返回列表键key的长度,也即是,返回列表包含的列表项的数量。

因为Redis会记录每个列表的长度,所以这个命令无须遍历列表,它的复杂度为O(1)。

2.返回给定索引上的项

LINDEX key index

返回列表键key中,指定索引index上的列表项,index索引可以是正数或者负数。

复杂度为O(N),N为列表的长度。

3.返回给定索引范围之内的所有项

LRANGE key start stop

返回列表键key中,从索引start至stop范围内的所有列表项。两个索引参数都可以是正数或者负数。

复杂度为O(N),N为被返回的列表项数量。

四、插入和删除操作

1.设置指定索引上的列表项

LSET key index value

将列表键key索引index上的列表项设置为value,设置成功时命令返回OK。如果index参数超过了列表的索引范围,那么命令返回一个错误。针对表头和表尾节点进行处理时,命令的复杂度为O(1);其他情况下,命令的复杂度为O(N),N为列表的长度。

2.在指定位置插入列表项

LINSERT key BEFORE | AFTER pivot value

根据命令调用时传递的是BEFORE选项还是AFTER选项,将值value插入到指定列表项pivot的之前或者之后。当pivot不存在于列表key时,不执行任何操作。返回-1表示pivot不存在;返回0表示键key不存在;插入成功时则返回列表当前的长度。复杂度为O(N),N为列表长度。

3.从列表中删除指定的值

LREM key count value

根据参数count的值,移除列表中与参数value相等的列表项:

如果count > 0,那么从表头开始向表尾搜索,移除最多count个值为value的列表项。

如果count < 0,那么从表尾开始向表头搜索,移除最多abs(count)个值为value的列表项。

如果count = 0,那么移除列表中所有值为value的列表项。

命令返回被移除列表项的数量。命令的复杂度为O(N),N为列表的长度。

4.修剪列表

LTRIM key start stop

对一个列表进行修剪,让列表只保留指定索引范围内的列表项,而将不在范围内的其他列表项全部删除。两个索引都可以是正数或者负数。命令执行成功时返回OK,复杂度为O(N),N为被移除列表项的数量。

五、阻塞式弹出操作

命令作用复杂度
BLPOP key [key...] timeoutLPOP命令的阻塞版本;命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最左端的项;如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为止。设置timeout参数为0表示永远阻塞。O(N),N为输入列表的数量
BRPOP key [key...] timeoutRPOP命令的阻塞版本;命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最右端的项;如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为止。设置timeout参数为0表示永远阻塞。O(N),N为输入列表的数量

1.非阻塞

当发现给定的列表中至少有一个非空列表时,BLPOP或者BRPOP就会立即从那个列表里面弹出元素,在这种情况下,BLPOP就像一个接受多参数的LPOP命令,而BLPOP就像一个接受多参数的POP命令。

2.阻塞并超时

如果给定列表都是空的,那么BLPOP/BRPOP将被阻塞。如果在阻塞的过程中,给定的列表一直没有新项被推入,那么当设定的超时时间到达之后,命令将向被阻塞的客户端返回nil。

3.阻塞并弹出情况

如果在客户端X被阻塞的过程中,有另一个客户端Y给造成客户端X被阻塞的列表推入了新项,那么服务器会将这个新项返回给客户端X。

4.BLPOP/BRPOP的先到先服务原则

如果有多个客户端同时因为某个列表而被阻塞,那么当有新的值推入到这个列表时,服务器会按照先到先服务原则,优先向最早被阻塞的客户端返回新值。

5.列表的使用场景

消息队列

当消息发送者向消息接受者发消息时,服务器并不是真实将消息推送给消息接收者才返回,而是将消息丢入消息队列,然后直接响应用户,随后由消息接收者从消息队列取发送给自己的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值