redis命令(list)

来源:互联网 发布:石家庄淘宝运营公司 编辑:程序博客网 时间:2024/05/04 01:32

头元素:列表左端/前端第一个元素

尾元素:列表右端/后端第一个元素

空列表:指不包含任何元素的列表,Redis将不存在的key也是为空列表

1.LPUSH key value [value...]

将一个或多个值value插入到列表key的表头。

如果有多个value值,那么各个value值按照从左到右的顺序依次插入到表头:比如一个空列表(mylist)执行LPUSH mylist a b c,则结果列表为c  b a,等同于执行命令LPUSH mylist a、LPUSH mylist b、LPUSH mylist c.

如果key不存在,一个空列表会被创建并执行LPUSH操作。

当key存在但不是列表类型时,返回一个错误。

返回值:执行LPUSH命令之后,列表的长度。

2.LPUSHX key value:

将值value插入到列表key的表头,当且仅当key存在并且是一个列表。

和LPUSH命令相反,当key不存在时,LOUSHX命令什么也不做。

返回值:LPUSHX命令执行之后,表的长度。

3.RPUSH key value [value...]

将一个或多个值得value插入到列表key的表尾。

如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表(mylist)执行RPUSH mylist a b c,则结果列表为a b c,等同于执行命令RPUSH mylist a 、RPUSH mylist b 、 RPUSH mylist c.

如果key不存在,一个空列表会被创建并执行RPUSH操作

当key存在但不是列表类型时,返回一个错误。

返回值:执行RPUSH操作后,表的长度

4.RPUSHX key value :

将值value插入到列表key的表尾,当且仅当key存在并且是一个列表。

和RPUSH命令相反,当key不存在时,RPUSH命令什么也不做。

返回值:RPUSHX命令执行之后,,表的长度。

5.lpop key:

移除并返回列表key的头元素,当key不存在时,返回nil.

6.RPOP key:

移除并返回列表key的尾元素,当key不存在时,返回nil..

7.BLPOP key [key....] timeout

BLPOP 是列表的阻塞式弹出原语。

它是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,链接将被BLPOP命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个key参数时,按参数key的先后顺序检查各个列表 ,弹出第一个非空列表的头元素。

非阻塞行为:

当BLPOP被调用时,如果给定key内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字一起,组成结果返回给调用者。
当存在多个给定key时,BLPOP按给定key参数排列的先后顺序,依次检查各个列表。
假设现有job.command和request三个列表,其中job不存在,command和request都持有非空列表,考虑以下命令:
BLPOP  job command request 0

BLPOP 保证返回的元素来自command,因为它是按‘查找job->查找command->查找request’这样的顺序,第一个找到的非空列表。

阻塞行为:

如果所有给定key都不存在或包含空列表,那么BLPOP命令将阻塞连接,知道等待超时,或者有另一个客户端对给定key的任意一个执行LPUSH或RPUSH命令为止。

超时参数timeout接受一个以秒为单位的数字作为值,超时参数设为0表示阻塞时间可以无限延长。

相同的key被多个客户端同时阻塞:

相同的key可以被多个客户端同时阻塞。

不同的客户端被放进一个队列中,按‘先阻塞先服务’的顺序为key执行BLPOP命令。

在MULTI/EXEC事务中的BLPOP:

BLPOP可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在MULTI/EXEC块当中没有意义。因为这要求整个服务器被阻塞以保证执行时的原子性,该行为组织了其他客户端执行LPUSH或RPUSH命令。

因此一个被包裹在MULTI/EXEC命令,行为表现得就像LPOP一样,对空列表弹出列表元素,不进行任何阻塞操作。

返回值:如果列表为空,返回一个nil;

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

8.brpop key [key...] timeout:

BRPOP命令的阻塞式弹出原语

它是RPOP命令阻塞版本,当给定列表内没有任何元素可提供弹出的时候,连接将被BRPOP命令阻塞,直到等待超时或发现可弹出元素为止。

当给多个key参数时,按参数key的先后顺序依次检查各个列表,安琥第一个非空列表的尾部元素。

关于阻塞操作的更多信息,请查看BLPOP命令,BRPOP除了弹出元素的位置和BLPOP不同之外,其他表现一致。

返回值:假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长;

反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

9.LLEN key:

返回列表key的长度

如果key不存在,则key被解释为一个空列表,返回0.

如果key不是列表类型,返回一个错误。

10.lrange key start stop

返回列表key中指定区间内的元素,区间以偏移量start和stop指定。

下标(index)参数start和stop都是以0为底,以0表示列表第一个元素,以1表示列表的第二个元素。

也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素。

注意LRANGE命令和编程语言区间函数的区别:

假如你有一个包含一百个元素的列表,对该列表执行LRANGE list 0 10,结果是一个包含11个元素的列表,这表明stop下表也在LRANGE命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的Range new 、Array#slice和Python的range()函数

超出范围的下标:

超出范围的下标值不会引起错误。

如果start下标比列表的最大下表end stop还要大, LRANGE返回一个空列表。

如果stop下标比end下标还要大,Redis将stop的值设定为end.

返回值:一个列表,包含指定区间内的元素。

11.lrem key count value:

根据参数count的值,移除列表中的参数value相等的元素。

count的值可以是以下几种:

count > 0:从表头向表尾搜索,移除与value相等的元素,数量为count;

count < 0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值;

count = 0:移除表中所有与value相等的值。

返回值:被移除元素的数量;因为不存在的key被视作空表,所以当key不存在时,LREM命令总是返回0.

12.LEST key index value:

将列表key下表为index的元素的值设置为value。

当index参数超出范围,或对一个空列表进行LSET时,返回一个错误。

返回值:操作成功返回OK,否则返回错误信息。

13.ltrim key start stop

对一个列表进行修剪,就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

ltrim list 0 2:表示只保留列表list的前三个元素,其余元素全部删除。

下标以0开始,可以使用负数,代表倒数第几个元素;

当key不是列表类型时,返回一个错误;

LTRIM命令通常LPUSH命令或RPUSH命令配合使用

超出范围的下标:超出范围的下标值不会引起错误。

如果start下标比列表的最大下标end还要大,LTRIM返回一个空列表(因为LTRIM已经将整个列表清空)

如果stop下标比end下标还要大,Redis将stop的值设置为end

命令执行成功时,返回OK;

14.lindex key index:

返回列表key中,下标为index的元素;

下标以0开始,可使用负数,代表倒数第几位;

如果key不是列表类型,返回一个错误;

如果index参数的值不在列表的区间范围内,返回nil;

15.linsert key BEFORE | AFTER pivot value;

将value插入列表key当中,位于值pivot之前或之后。

当pivot不存在于列表key时,不执行任何操作。

如果key不是列表类型,返回一个错误。

返回值:命令执行成功,返回插入操作完成之后,列表的长度;没有找到pivot,返回-1;key不存在或为空列表,返回0。

16.rpoplpush source destination:

命令RPOPLPUSH在一个原子时间内,执行以下两个动作:将列表source中的最后一个元素弹出,并返回给客户端 ;将source弹出的元素插入到列表destination,作为destination列表的头元素。

如果source不存在,值nil被返回,并且不执行其他动作。

如果source和destination相同,则列表中的表尾元素被移动到表头,可以把这中特殊情况视作列表的旋转操作。

返回:被弹出元素。

设计模式:一个安全的队列:

Redis的列表经常被用作队列,用于在不同程序之间有序的交换消息。一个程序通过LPUSH命令将消息放入队列中,而另一个程序通过RPOP命令取出队列中等待时间最长的消息。

不幸的是,在这个过程中,一个消费者可能在获得一个消息之后崩溃,而未完成的消息也因此丢失。

使用rpoplpush命令可以解决这个问题,因为它在返回一个消息之余,还将该消息添加到另一个列表中,另外的这个咧白哦可以用作消息的备份表:假如一切正常,当消费者完成该消息的处理之后,可用lrem命令将该消息从备份表删除。

另一方面,助手程序可以通过见识备份表,将超过一定处理时限的消息重新放入队列中去(负责处理改消息的消费者可能已经崩溃),这样就不会丢失任何消息了。

17.brpoplpush source destination timeout:

brpoplpush是rpoplpush的阻塞版本,当给定列表source不为空时,srpoplpush的表现和rpoplpush一样。

当source为空时,brpoplpush命令将阻塞连接,直到等到超时,或者另一个客户端对source执行lpush或rpush命令为止。

超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长。

返回值:假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长;反之,返回一个含有两个原色的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。


0 0