List是Redis的基础数据类型之一,相似于Java中的LinkedList。一个列表最多包含232个元素,常被用做模拟队列操做,接下来咱们具体介绍一下List相关的命令。bash
BLPOP
最先可用版本:2.0.0微信
时间复杂度:O(1)app
用法:ui
1BLPOP key [key ...] timeout
BLPOP是LPOP的阻塞版本,当列表没有元素能够被弹出时,链接将被阻塞。当给定多个key,会按参数key的顺序检查各个列表,弹出第一个非空列表的的头元素。timeout表示阻塞的最大秒数,timeout为0表示无限阻塞。spa
这里有一个问题,当多个元素同时push进一个list时,阻塞的BLPOP命令会有什么操做。在说明以前,咱们先思考一下如何操做才会出现这样的状况:.net
对list执行LPUSH mylist a b c这样的命令code
对同一个list进行屡次push操做,这些操做是在事务中执行的orm
使用Redis2.6之后的版本执行Lua脚本进行push操做索引
对于这个问题,Redis2.4版本和Redis2.6之后的版本处理方法有所不一样。队列
假如客户端A执行命令
1BLPOP mylist 0
这时mylist为空,客户端A会被阻塞,此时客户端B执行了命令
1LPUSH mylist a b c
若是在Redis2.6版本以后,客户端A会返回c,由于在客户端Bpush了元素a、b、c后,其从左到右的顺序是c、b、a,可是在Redis2.4版本中,客户端会在push操做的上下文,因此当LPUSH开始往list里push第一个元素时,它就被传送到客户端A,也就是客户端A会接收到a。
有时,咱们会有这样的需求:咱们须要为了等待Set的新元素而阻塞队列,这样就须要一个阻塞版的SPOP,惋惜目前尚未支持这样的命令。不过咱们能够使用BLPOP命令来实现,下面是实现的伪代码:
消费者:
1LOOP forever
2 WHILE SPOP(key) returns elements
3 ... process elements ...
4 END
5 BRPOP helper_key
6END
生产者:
1MULTI
2SADD key element
3LPUSH helper_key x
4EXEC
BRPOP
最先可用版本:2.0.0
时间复杂度:O(1)
它与BLPOP基本相同,不一样的地方在于它是从尾部弹出元素,而BLPOP是从头部弹出元素。
BRPOPLPUSH
最先可用版本:2.2.0
时间复杂度:O(1)
用法:
1BRPOPLPUSH source destination timeout
它是RPOPLPUSH的阻塞版本,当source包含元素时,它与RPOPLPUSH表现的同样,当source为空时,Redis会被阻塞,直到另外一个客户端push元素,或者达到timeout时间限制。
LINDEX
最先可用版本:1.0.0
时间复杂度:O(N),N是找到目标元素所跨越元素的个数,当目标元素为第一个或者最后一个时,时间复杂度为O(1)。
该命令用于返回列表中指定位置的元素,index是从0开始的,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推。当key不是一个list时,会返回一个错误。当index超出范围时返回nil。
LINSERT
最先可用版本:2.2.0
时间复杂度:O(N),N为在找到基准value前所跨越的元素个数。也就是说,若是插入到头部,时间复杂度为O(1),若是插入到尾部,时间复杂度为O(N)。
用法:
1LINSERT key BEFORE|AFTER pivot value
该命令把value插入到基准值pivot的前面或者后面,若是key不存在,list被当作空列表,不会发生任何操做。若是key存储的不是list,则会报错。命令的返回值是,插入操做后,list的长度,若是找不到基准值pivot,则会返回-1。
LLEN
最先可用版本:1.0.0
时间复杂度:O(1)
返回指定key的list的长度,若是key不存在,则被看做是空列表,返回0。若是key存储的不是list,则会报错。
LPOP
最先可用版本:1.0.0
时间复杂度:O(1)
该命令用于删除并返回list的第一个元素。当key不存在时,返回nil。
LPUSH
最先可用版本:1.0.0
时间复杂度:O(1)
将全部指定的value插入列表的头部,若是key不存在,就先建立一个空列表并进行插入操做,若是key存储的不是list,则会返回一个错误。咱们能够一次插入多个元素,他们从左到右依次被插入到list中,所以,
1LPUSH mylist a b c
命令生成的列表,c是第一个元素,a是第三个元素。该命令的返回值是插入操做后列表的长度。须要注意的一点是:在Redis2.4版本之前(不包括2.4)是不支持一次插入多个元素的。
LPUSHX
最先可用版本:2.2.0
时间复杂度:O(1)
当key存在时,在头部插入指定元素,key不存在时,不进行插入操做。
LRANGE
最先可用版本:1.0.0
时间复杂度:O(S+N),S是start元素的偏移量,N是指定范围元素的个数
用法:
1LRANGE key start stop
返回指定key的指定范围的元素,start和stop都是下标(从0开始),一样,下标能够是负数,-1表示倒数第一个,-2表示倒数第二个。命令返回的结果会包含下标为stop的元素。若是start超出list的长度返回,则会返回一个空的列表,若是stop超出list的长度返回,则会返回到最后一个元素。
LREM
最先可用版本:1.0.0
时间复杂度:O(1)
用法:
1LREM key count value
移除list中前count次出现的value
count>0时:从头至尾匹配value
count=0时:移除所有匹配到value的元素
count<0时,从尾部到头部匹配value
当key不存在时,被当作空列表看待,直接返回0。
LSET
最先可用版本:1.0.0
时间复杂度:O(N),N为list的长度
设置指定下标的value,若是下标超出范围,则会返回一个错误。
LTRIM
最先可用版本:1.0.0
时间复杂度:O(N),N删除掉的元素的个数
该命令用来修剪一个已经存在的list,修剪后的list只包含指定范围的元素。start和stop都是从0开始的索引,例如,
1LTRIM foobar 0 2
就是只保留foobar的前3个元素。start和stop也能够是负数,-1表示倒数第一个元素,-2表示倒数第二个,以此类推。若是下标超出范围,并不会报错,而是进行以下处理:若是start比list的最后一个元素的下标大,或者start>end,结果就是空list,若是end大于最大下标,Redis会将其当成最后一个元素来处理。
RPOP
最先可用版本:1.0.0
时间复杂度:O(1)
删除并返回list的最后一个元素。当key不存在时,返回nil。
RPOPLPUSH
最先可用版本:1.2.0
时间复杂度:O(1)
原子性的返回并删除source的最后一个元素,并把该元素存储到destination的第一个元素的位置。举个栗子,source保存了元素a、b、c,destination保存了x、y、z,执行了
1RPOPLPUSH source destination
后,source保存的会是a、b,而destination保存的则是c、x、y、z。该命令的返回值是那个从source被移出和存入destination的元素。
RPUSH
最先可用版本:1.0.0
时间复杂度:O(1)
将指定元素插入到指定key的尾部。若是key不存在,就建立一个空的列表。若是key保存的不是list,则会返回一个错误。在2.4版本以后,能够使用一条命令一次插入多个值,插入的顺序是从左到右。
RPUSHX
最先可用版本:2.2.0
时间复杂度:O(1)
它和RPUSH惟一不一样的一点就是若是key不存在,就不会进行任何操做。
本文分享自微信公众号 - 代码洁癖患者(Jackeyzhe2018)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。