四 redis之list
redis提供的list类型扩展了平时说的列表,不仅可以用来当队列用,还可以当阻塞队列,栈使用.
注意: 以下命令中涉及删除元素的,当list中最后一个元素被删除了,list也被删除
队列
队列是一种先进先出的线性数据结构.数据只能从队头出去,从队尾加入.像平时的排队就是队列.
每个元素可以是连续的,用数组实现,也可以是不连续的,用连表实现.
当以右边为队头,左边为队尾时:
LPUSH
LPUSH key element [element ...]
往队列的左边加入若干个元素.
可以看到,lpush命令中左边的数据加入到list中后,位置靠右边.
LPUSHX
LPUSHX key element [element ...]
LPUSHX和LPUSH含义相同,除了当key存在时才会加入list中.
RPOP
RPOP key [count]
从list右边移除count个元素.
注意元素间的顺序.
LRANGE
LRANGE key start stop
返回key对应的list中从start到stop指定范围的元素.可以是负数,-1表示最后一个元素,-2表示倒数第二个元素.
可以看到,指定的下标超出了元素的范围也能正常执行.
当以左边为队头,右边为队尾时:
RPUSH
RPUSH key element [element ...]
从list的右边加入若干个元素.
注意,1在最左边.
RPUSH
RPUSHX key element [element ...]
RPUSHX和RPUSH含义相同,除了当key存在时才会加入list中.
LPOP
LPOP key [count]
从key对应的list的左边移除count个元素并返回.
栈
栈是一种先进后出的数据结构.
栈底不能删除,新增元素,只能从栈顶新增,删除元素.
将list作为栈使用,可将右边或左边看为栈底,然后从另一边使用新增,删除元素即可.比如右边作为栈底,入栈使用lpush,出栈使用lpop.
阻塞队列
阻塞队列:当队列为空时,从队列中取元素会阻塞.
当list为空时,lpop会返回nil.
BLPOP
BLPOP key [key ...] timeout
BLPOP在超时时间内阻塞等待元素到达,如果超时返回nil.
在开另一个窗口:
执行blpop后,会在超时时间到来之前或者list中有元素为止.如果list有元素则返回.如果超时了则返回nil.
BRPOP
BRPOP key [key ...] timeout
BRPOP和BLPOP含义一致,只是从右边移除元素.
当有多个key时,超时时间内只要其中一个key有元素则返回.
其他命令
LINDEX
LINDEX key index
返回key对应的list中下标index出的元素.
下标可以使用负数,-1表示最后一个元素.如果下标超出list的范围则返回nil.
LINSERT
LINSERT key BEFORE|AFTER pivot element
在key中element前(BEFORE)或后(AFTER)插入pivot.
如果element不存在key中,不会插入数据.
LLEN
LLEN key
返回key对应的list中元素个数.
LMOVE
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
将source中的元素移出并插入到destination中.
第一个LEFT|RIGHT表示source中移出元素的方向,LEFT表示从左边移除,RIGHT表示从右边移除.第二个LEFT|RIGHT表示destination中插入元素的方向,LEFT表示从左边插入,RIGHT表示从右边插入.
如果source不存在元素则什么也不做.
LMPOP
LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT count]
从提供的键名列表中的第一个非空列表键中弹出一个或多个元素。根据传递的参数,从第一个非空列表的左侧或右侧弹出元素。返回元素的数量限制在非空列表的长度和count参数(默认为1)之间的较低值。
从第一个非空list key中移除指定的元素,就算key中的数量小于指定的数量,也不会在选择其他的key.
LPOS
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
该命令返回Redis列表中匹配元素的索引。默认情况下,当没有给出选项时,它将从头到尾扫描列表,寻找第一个匹配的“元素”。如果找到该元素,则返回其索引(列表中从零开始的位置)。否则,如果没有找到匹配项,则返回nil。
mylist中c从左到右数,出现在第三个位置(下标从0计算).
list中数据可能有重复值.有时需要查找第n次出现的位置.这就需要rank选项了.rank 1表示第一次出现的位置:
c在mylist中第二次出现的下标是6.
rank也可以使用负数,-1表示最后一个.c在mylist中最后一次出现的下标是7.无论rank是正数还是负数,lpos返回的结果都是从左往右数的下标.
有时我们不仅要返回第N个匹配元素,还要返回所有前N个匹配元素的位置。这可以通过使用COUNT选项来实现:
我们可以组合COUNT和RANK,表示从RANK选项指定的第N个匹配开始, 进行count次匹配:
count 0表示返回所有匹配.
最后,MAXLEN选项告诉命令仅将所提供的元素与给定的最大列表项数进行比较。因此,例如指定MAXLEN 1000将确保该命令仅执行1000次比较.如果list中元素很多,要匹配所有元素要花费很长时间.MAXLEN 0 表示匹配所有.
最多匹配5次,也就是最多匹配到箭头的位置.
LREM
LREM key count element
从左到右移除count个element.
LSET
LSET key index element
在index处设置元素element,如果index超出list长度则报错.
index可以使用负数.
LTRIM
LTRIM key start stop
start和stop都是从0开始的下标.ltrim mylist 0 2表示只保留mylist中下标0到下标2的元素.
下标也可以使用负数.以上表示保留最后两个元素.
RPOPLPUSH
RPOPLPUSH source destination
原子性地返回并删除存储在源位置的列表的最后一个元素(尾部),并将该元素推送到存储在目标位置的列表第一个元素(头部)。
将mylist的最后一个元素移除并插入到mylist1的左边第一个位置.
BLMOVE
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
BLMOVE是LMOVE的阻塞版本.
BLMPOP
BLMPOP timeout numkeys key [key ...] LEFT|RIGHT [COUNT count]
BLMPOP是LMPOP的阻塞版本.
BRPOPLPUSH
BRPOPLPUSH source destination timeout
BRPOPLPUSH是RPOPLPUSH的阻塞版本.