redis学习计划(四)redis常用数据类型 List

1.List简介

redis中的List就是一个有序的链表。与普通链表并无太大的差异,可以通过命令在左右进行插入取出操作。

2.List相关命令

1)

命令:LPUSH key value [value ...] 

时间复杂度:O(1)

命令描述:在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 

返回值:插入后链表中元素的数量。

(2

命令:RPUSH key value [value ...] 

时间复杂度:O(1)

命令描述:在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 

返回值:插入后链表中元素的数量。 

(3

命令:LPOP key 

时间复杂度:O(1)

命令描述:返回并弹出指定Key关联的链表中的第一个元素,即头部元素,。如果该Key不存,返回nil。

返回值:链表头部的元素。

(4

命令:RPOP key 

时间复杂度:O(1)

命令描述:返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。 

返回值:链表尾部的元素。

(5

命令:LPUSHX key value 

时间复杂度:O(1)

命令描述:仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的头部插入参数中给出的Value,否则将不会有任何操作发生。

返回值:插入后链表中元素的数量。 

(6

命令:RPUSHX key value 

时间复杂度:O(1)

命令描述:仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的尾部插入参数中给出的Value,否则将不会有任何操作发生。

返回值:插入后链表中元素的数量。 

(7

命令:LRANGE key start stop

时间复杂度:O(S+N)

命令描述:该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。

返回值:返回指定范围内元素的列表。

(8

命令:LLEN key

时间复杂度:O(1)

命令描述:返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。

返回值:链表中元素的数量。

(9

命令:LREM key count value 

时间复杂度:O(N)

命令描述:在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0。

返回值:返回被删除的元素数量。

(10

命令:LSET key index value 

时间复杂度:O(N)

命令描述:设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。

(11

命令:LINDEX key index

时间复杂度:O(N)

命令描述:该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。

返回值:返回请求的元素,如果index超出范围,则返回nil。

(12

命令:LTRIM key start stop 

时间复杂度:O(N)

命令描述:N表示被删除的元素数量。该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素。和其他命令一样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。

(13

命令:LINSERT key BEFORE|AFTER pivot value 

时间复杂度:O(N)

命令描述:该命令的功能是在pivot元素的前面或后面插入参数中的元素value。如果Key不存在,该命令将不执行任何操作。如果与Key关联的Value类型不是链表,相关的错误信息将被返回。

返回值:成功插入后链表中元素的数量,如果没有找到pivot,返回-1,如果key不存在,返回0。

(14

命令:RPOPLPUSH source destination

时间复杂度:O(1)

命令描述:原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。

返回值:返回弹出和插入的元素。

(15

命令:BRPOPLPUSH source destination timeout

时间复杂度:O(1)

命令描述:此命令是RPOPLPUSH命令的阻塞版。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。

返回值:返回弹出和插入的元素。

(16

命令:BLPOP key [key ...] timeout

时间复杂度:O(1)

命令描述:BLPOP是LPOP的阻塞版。当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。不同的客户端被放进一个队列中,按『先阻塞先服务』(first-BLPOP,first-served)的顺序为 key 执行 BLPOP 命令。

(17

命令:BRPOP key [key ...] timeout

时间复杂度:O(1)

命令描述:BRPOP是RPOP的阻塞版。详情与BLPOP除了弹出位置不同以外,其他基本相同。

 

简单归纳:

List的主要操作基本与链表类似,归纳记忆为:

lpush rpush lpop rpop:从头部尾部插入数据,弹出数据。

lpushx rpushx 插入数据的时候判断key是否存在,如果不存在就不进行任何操作。

blpop brpop 阻塞的进行弹出操作。

lrange 获取数据

llen 判断数据量

lset lindex linsert ltrim lrm 对于链表的简单操作,设置啊,插入啊,索引啊,删除啊等操作。

rpoplpush brpoplpush 从某list弹出数据并且push到另外的list。b..只是阻塞式的操作。

既然是链表式的存储操作,就一定会具有链表的特性,插入删除较快,索引较慢,所以此数据结构一般用于有序的数据存储,以及可以用于消息队列。

posted @ 2017-06-22 12:21  kobe_lzq  阅读(352)  评论(0编辑  收藏  举报