Redis的数据结构之List
Redis的数据结构和Java的集合框架很像,如果Java的集合框架学的好,这个很快就能掌握。
List就是一个有序元素的集合,允许重复。
在Redis中使用时,因为其有序的特性,也可以将其做一个队列来使用,队列嘛,先进先出。
也可以作为一个数组来使用,可以随时获取设置指定下标的元素。
命令
这里记录了Redis支持的命令。
LPUSH
LPUSH list item [item...]
用户可以通过LPUSH命令,将一个或多个元素推入给定列表的左端
如果列表不存在则创建列表
在推入操作执行完毕之后,LPUSH命令会返回列表当前包含的元素数量作为返回值。
RPUSH
RPUSH list item [item...]
RPUSH命令和LPUSH命令类似,这两个命令执行的都是元素推入操作,唯一区别就在于LPUSH命令会将元素推入列表左端,而RPUSH命令会将元素推入列表右端。
如果列表不存在则创建列表
在推入操作执行完毕之后,RPUSH命令会返回列表当前包含的元素数量作为返回值。
LPUSHX 和 RPUSHX
LPUSHX list item
LPUSHX list item
这两个命令对待空列表的方式与LPUSH命令和RPUSH命令正好相反:
●LPUSHX命令只会在列表已经存在的情况下,将元素推入列表左端。
●RPUSHX命令只会在列表已经存在的情况下,将元素推入列表右端。
且这两个命令只能推入一个元素。
LPOP
LPOP list
用户可以通过LPOP命令移除位于列表最左端的元素,并将被移除的元素返回给用户
如果用户给定的列表并不存在,那么LPOP命令将返回一个空值,表示列表为空,没有元素可供弹出
RPOP
RPOP list
用户可以通过RPOP命令移除位于列表最右端的元素,并将被移除的元素返回给用户
RPOPLPUSH
RPOPLPUSH source target
RPOPLPUSH命令的行为和它的名字一样,首先使用RPOP命令将源列表最右端的元素弹出,然后使用LPUSH命令将被弹出的元素推入目标列表左端,使之成为目标列表的最左端元素
如果用户传给RPOPLPUSH命令的源列表并不存在,那么RPOPLPUSH命令将放弃执行弹出和推入操作,只返回一个空值表示命令执行失败
LLEN
LLEN list
用户可以通过执行LLEN命令来获取列表的长度,即列表包含的元素数量
对于不存在的列表,LLEN命令将返回0作为结果
LINDEX
LINDEX list index
Redis列表包含的每个元素都有与之对应的正数索引和负数索引:
●正数索引从列表的左端开始计算,依次向右端递增:最左端元素的索引为0,左端排行第二的元素索引为1,左端排行第三的元素索引为2,以此类推。最大的正数索引为列表长度减1,即N-1。
●负数索引从列表的右端开始计算,依次向左端递减:最右端元素的索引为-1,右端排行第二的元素索引为-2,右端排行第三的元素索引为-3,以此类推。最大的负数索引为列表长度的负数,即-N。
如果用户给定的索引超出了这一范围,那么LINDEX命令将返回空值,以此来表示给定索引上并不存在任何元素
LRANGE
LRANGE list start end
用户除了可以使用LINDEX命令获取给定索引上的单个元素之外,还可以使用LRANGE命令获取给定索引范围上的多个元素
一个快捷地获取列表包含的所有元素的方法,就是使用0作为起始索引、-1作为结束索引去调用LRANGE命令,这种方法非常适合于查看长度较短的列表
与LINDEX一样,LRANGE命令也需要处理超出范围的索引:
●如果用户给定的起始索引和结束索引都超出了范围,那么LRANGE命令将返回空列表作为结果。
●如果用户给定的其中一个索引超出了范围,那么LRANGE命令将对超出范围的索引进行修正,然后再执行实际的范围获取操作;其中超出范围的起始索引会被修正为0,而超出范围的结束索引则会被修正为-1。
LSET
LSET list index new_element
用户可以通过LSET命令,为列表的指定索引设置新元素
因为LSET命令只能对列表中已存在的索引进行设置,所以如果用户给定的索引超出了列表的有效索引范围,那么LSET命令将返回一个错误
LINSERT
LINSERT list BEFORE|AFTER target_element new_element
通过使用LINSERT命令,用户可以将一个新元素插入列表某个指定元素的前面或者后面
LINSERT命令第二个参数的值可以是BEFORE或者AFTER,它们分别用于指示命令将新元素插入目标元素的前面或者后面。命令在完成插入操作之后会返回列表当前的长度。
为了执行插入操作,LINSERT命令要求用户给定的目标元素必须已经存在于列表当中。相反,如果用户给定的目标元素并不存在,那么LINSERT命令将返回-1表示插入失败
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命令将在给定时限到达之后向客户端返回一个空值,表示没有任何元素被弹出
BRPOP
BRPOP list [list...] timeout
BRPOPLPUSH
BRPOPLPUSH source target timeout
BRPOPLPUSH命令是RPOPLPUSH命令的阻塞版本,BRPOPLPUSH命令接受一个源列表、一个目标列表以及一个秒级精度的超时时限作为参数
根据源列表是否为空,BRPOPLPUSH命令会产生以下两种行为:
●如果源列表非空,那么BRPOPLPUSH命令的行为就和RPOPLPUSH命令的行为一样,BRPOPLPUSH命令会弹出位于源列表最右端的元素,并将该元素推入目标列表的左端,最后向客户端返回被推入的元素。
●如果源列表为空,那么BRPOPLPUSH命令将阻塞执行该命令的客户端,然后在给定的时限内等待可弹出的元素出现,或者等待时间超过给定时限为止。