redis--list 命令

list:允许重复元素,按照插入顺序,依次排列

1.增:

lpush  key value1 value2:插入到表头

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

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

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


lpushx key value1 value2:插入到表头

如果key不存在,lpushx就什么也不做。

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


rpush key value1 value2:插入到表尾

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

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

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


rpushx key value1 value2:插入到表尾

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

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

linsert key before||after pivot value: 在pivot前或者是后添加key value
pivot 不存在于列表 key 时,不执行任何操作。

key不存在时,key被视为空列表,不执行任何操作。

如果 key 不是列表类型,返回一个错误。
返回值:
如果命令执行成功,返回插入操作完成之后,列表的长度。
如果没有找到 pivot,返回 -1
如果 key不存在或为空列表,返回 0


2.删:
lpop key:

移除并返回列表key的头元素。

返回值:删除列表的头元素。key不存在时,返回nil


rpop key:

移除并返回列表key的尾元素。

返回值:得到列表的长度,空的时候返回0,不是列表类型,返回错误。


lrem key count value:
count的值可以是以下几种:
count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count
count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
count = 0: 移除表中所有与value相等的值。

返回值:被移除的元素的数量。key不存在的时候,lrem就返回0.


LTRIM key start stop:

list 只留下这区间的元素


3.改:

lset key index value: 将列表key下标为index的元素的值设置为value

index参数超出范围,或对一个空列表(key不存在)进行LSET时,返回一个错误。



4.查

llen key:返回key的长度

返回这个key,index位置的数据值,

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


lindex key index:返回这个key,index位置的数据值,

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

如果index参数的值不在列表的区间范围内(out of range),返回nil


lrange  key 0 -1 :列出所有的元素。


exists key:查看key是否存在

返回值:key的长度



5.阻塞式


 blpop key [key ...]  timeout:blpop shi lpop 的阻塞式原语

非阻塞行为:

当存在多个给定key时,BLPOP按给定key参数排列的先后顺序,依次检查各个列表。弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字一起,组成结果返回给调用者。

redis> BLPOP job command request 0  # job列表为空,被跳过,紧接着command列表的第一个元素被弹出。
1) "command"    # 弹出元素所属的列表
2) "update system..."   # 弹出元素所属的值

阻塞行为:

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

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

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

不同的客户端被放进一个队列中,按”先阻塞先服务”(first-BLPOP,first-served)的顺序为key执行BLPOP命令。

BLPOP可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在MULTI/EXEC块当中没有意义。因为这要求整个服务器被阻塞以保证块执行时的原子性,该行为阻止了其他客户端执行LPUSH或RPUSH命令。因此,一个被包裹在MULTI/EXEC块内的BLPOP命令,行为表现得就像LPOP一样,对空列表返回nil,对非空列表弹出列表元素,不进行任何阻塞操作。


brpop 同上,只是弹出的是队尾的元素。

brpoplpush 

当列表source为空时,BRPOPLPUSH命令将阻塞连接,直到等待超时,或有另一个客户端对source执行LPUSH或RPUSH命令为止。

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







6.知识点:

rpoplpush  source destination:

命令RPOPLPUSH在一个原子时间内,执行以下两个动作:

将列表source中的最后一个元素(尾元素)弹出,并返回给客户端。

source弹出的元素插入到列表destination,作为destination列表的的头元素。

返回值:被弹出的元素。

返回值:删除列表的尾元素。当key不存在时,返回nil

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

如果 source destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

设计模式: 一个安全的队列 Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message)。一个程序(称之为生产者,producer)通过 LPUSH 命令将消息放入队列中,而另一个程序(称之为消费者,consumer)通过 RPOP 命令取出队列中等待时间最长的消息。 不幸的是,在这个过程中,一个消费者可能在获得一个消息之后崩溃,而未执行完成的消息也因此丢失。 使用 RPOPLPUSH 命令可以解决这个问题,因为它在返回一个消息之余,还将该消息添加到另一个列表当中,另外的这个列表可以用作消息的备份表:假如一切正常,当消费者完成该消息的处理之后,可以用 LREM 命令将该消息从备份表删除。 另一方面,助手(helper)程序可以通过监视备份表,将超过一定处理时限的消息重新放入队列中去(负责处理该消息的消费者可能已经崩溃),这样就不会丢失任何消息了。








你可能感兴趣的:(redis)