四 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的阻塞版本.

posted @ 2024-09-17 20:32  shigp1  阅读(15)  评论(0编辑  收藏  举报