数据结构之List
LPUSH:将元素推入列表左端
RPUSH:将元素推入列表右端
LPUSHX、RPUSHX:只对已存在的列表执行推入操作
如果给定列表并不存在,那么LPUSHX命令和RPUSHX命令将放弃执行推入操作。
与LPUSH命令和RPUSH命令不一样,LPUSHX命令和RPUSHX命令每次只能推入一个元素,尝试向LPUSHX命令或RPUSHX命令给定多个元素将引发错误。
LPOP:弹出列表最左端的元素
用户可以通过LPOP命令移除位于列表最左端的元素,并将被移除的元素返回给用户。
RPOP:弹出列表最右端的元素
RPOPLPUSH:将右端弹出的元素推入左端
RPOPLPUSH source target
RPOPLPUSH命令的行为和它的名字一样,首先使用RPOP命令将源列表(source)最右端的元素弹出,然后使用LPUSH命令将被弹出的元素推入目标列表(target)左端,使之成为目标列表的最左端元素。RPOPLPUSH命令会返回被弹出的元素作为结果。
RPOPLPUSH命令允许用户将源列表和目标列表设置为同一个列表,在这种情况下,RPOPLPUSH命令的效果相当于将列表最右端的元素变成列表最左端的元素。
如果用户传给RPOPLPUSH命令的源列表(source)并不存在,那么RPOPLPUSH命令将放弃执行弹出和推入操作,只返回一个空值表示命令执行失败。
如果源列表非空,但是目标列表为空,那么RPOPLPUSH命令将正常执行弹出操作和推入操作。
LLEN:获取列表的长度
LINDEX:获取指定索引上的元素
Redis列表包含的每个元素都有与之对应的正数索引和负数索引。
LRANGE:获取指定索引范围上的元素
一个快捷地获取列表包含的所有元素的方法,就是使用0作为起始索引、-1作为结束索引去调用LRANGE命令。
redis> LRANGE alphabets 0 -1
- "a"
- "b"
- "c"
- "d"
- "e"
- "f"
如果用户给定的起始索引和结束索引都超出了范围,那么LRANGE命令将返回空列表作为结果。
如果用户给定的其中一个索引超出了范围,那么LRANGE命令将对超出范围的索引进行修正,然后再执行实际的范围获取操作;其中超出范围的起始索引会被修正为0,而超出范围的结束索引则会被修正为-1。
LSET:为指定索引设置新元素
LSET list index new_element
redis> LRANGE todo 0 -1
- "buy some milk"
- "watch tv"
- "finish homework"
redis> LSET todo 1 "have lunch"
OK
redis> LRANGE todo 0 -1
- "buy some milk"
- "have lunch" -- 新元素
- "finish homework"
LINSERT:将元素插入列表
LINSERT list BEFORE|AFTER target_element new_element
redis> LRANGE lst 0 -1
- "a"
- "b"
- "c"
redis> LINSERT lst BEFORE "b" "10086"
(integer) 4
redis> LRANGE lst 0 -1
- "a"
- "10086"
- "b"
- "c"
注释:如果target元素在列表中出现大于一次LINSERT的行为会怎样呢?官网并未给出解释,根据我的测试结果得知redis会从索引为0的位置开始查找第一个遇到的target_element并在该元素之前或之后做插入操作。(换句话说就是从左开始查找,以找到的第一个target作为实际的target而忽略其它的重复target)
LTRIM:修剪列表
LTRIM list start end
LTRIM命令接受一个列表和一个索引范围作为参数,并移除列表中位于给定索引范围之外的所有元素,只保留给定范围之内的元素。
LREM:从列表中移除指定元素
LREM list count element
count参数的值决定了LREM命令移除元素的方式:
- 如果count参数的值等于0,那么LREM命令将移除列表中包含的所有指定元素。
- 如果count参数的值大于0,那么LREM命令将从列表的左端开始向右进行检查,并移除最先发现的count个指定元素。
- 如果count参数的值小于0,那么LREM命令将从列表的右端开始向左进行检查,并移除最先发现的abs(count)个指定元素(abs(count)即count的绝对值)。
LREM命令在执行完毕之后将返回被移除的元素数量作为命令的返回值。
BLPOP:阻塞式左端弹出操作
BLPOP list [list ...] timeout
BLPOP命令是带有阻塞功能的左端弹出操作,它接受任意多个列表以及一个秒级精度的超时时限作为参数。
BLPOP命令会按照从左到右的顺序依次检查用户给定的列表,并对最先遇到的非空列表执行左端元素弹出操作。如果BLPOP命令在检查了用户给定的所有列表之后都没有发现可以执行弹出操作的非空列表,那么它将阻塞执行该命令的客户端并开始等待,直到某个给定列表变为非空,又或者等待时间超出给定时限为止。
当BLPOP命令成功对某个非空列表执行了弹出操作之后,它将向用户返回一个包含两个元素的数组:数组的第一个元素记录了执行弹出操作的列表,即被弹出元素的来源列表,而数组的第二个元素则是被弹出元素本身。
正如前面所说,当BLPOP命令发现用户给定的所有列表都为空时,就会让执行命令的客户端进入阻塞状态。如果在客户端被阻塞的过程中,有另一个客户端向导致阻塞的列表推入了新的元素,那么该列表就会变为非空,而被阻塞的客户端也会随着BLPOP命令成功弹出列表元素而重新回到非阻塞状态。
如果在同一时间,有多个客户端因为同一个列表而被阻塞,那么当导致阻塞的列表变为非空时,服务器将按照“先阻塞先服务”的规则,依次为被阻塞的各个客户端弹出列表元素。
如果用户向BLPOP命令传入的所有列表都是空列表,并且这些列表在给定的时限之内一直没有变成非空列表,那么BLPOP命令将在给定时限到达之后向客户端返回一个空值,表示没有任何元素被弹出。
BLPOP命令之所以会返回被弹出元素的来源列表,是为了让用户在传入多个列表的情况下,知道被弹出的元素来源于哪个列表。
BLPOP命令的阻塞效果只对执行这个命令的客户端有效,其他客户端以及Redis服务器本身并不会因为这个命令而被阻塞。
BRPOP:阻塞式右端弹出操作
BRPOPLPUSH:阻塞式弹出并推入操作
BRPOPLPUSH source target timeout
BRPOPLPUSH命令是RPOPLPUSH命令的阻塞版本,BRPOPLPUSH命令接受一个源列表、一个目标列表以及一个秒级精度的超时时限作为参数。
根据源列表是否为空,BRPOPLPUSH命令会产生以下两种行为:
·如果源列表非空,那么BRPOPLPUSH命令的行为就和RPOPLPUSH命令的行为一样,BRPOPLPUSH命令会弹出位于源列表最右端的元素,并将该元素推入目标列表的左端,最后向客户端返回被推入的元素。
·如果源列表为空,那么BRPOPLPUSH命令将阻塞执行该命令的客户端,然后在给定的时限内等待可弹出的元素出现,或者等待时间超过给定时限为止。