List是一个双向链表,按照插入顺序排序,可以添加一个元素到头部或者尾部。当对一个空key执行插入操作的时候会创建一个新表。
如果要清空列表,则会杀出对应的key空间。
在List中保存了头节点和未节点,以及链表包含的节点数量。所以查询链表中节点数量的复杂度为O(1)。
在List中保存的每个节点都保存了前一个节点,后一个节点,以及节点本身。
头结点的前一个节点为NULL,尾节点的后一个节点为NULL。
在Redis中提供了大概17个操作list的命令。
LPUSH key value[value ....]:从队列的左边入队一个或多个元素,时间复杂度O(1)。
RPUSH key value[value...]:从队列的右边入队一个或多个元素,时间复杂度O(1)。
LPOP key:从队列的左边出队一个元素,时间复杂度O(1)。
RPOP key:从队列的右边出队一个元素,时间复杂度O(1)。
LPUSHX key value:当队列存在时,从队列左边入队一个元素,时间复杂度O(1)。
RPUSHX key value:当队列存在时,从队列右边入队一个元素,时间复杂度O(1)。
LSET key index value:设置队列里面一个元素的值
LINDEX key index:返回下标为index的元素
LLEN key:获取队列的长度
LTRIM key start stop:剪裁列表到指定范围内的清单
LINSERT key BEFORE|AFTER pivot value:在列表中的另一个元素之前或之后插入一个元素
LREM key count value:从列表中删除元素,时间复杂度为O(N)。
count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值
count=0:移除表中所有与value相等的元素。
127.0.0.1:6379> lpush names a b c (integer) 3 127.0.0.1:6379> rpush names d e (integer) 5 127.0.0.1:6379> type names list 127.0.0.1:6379> lpop names "c" 127.0.0.1:6379> rpop names "e" 127.0.0.1:6379> lpushx names f (integer) 4 127.0.0.1:6379> rpushx names g (integer) 5 127.0.0.1:6379> lpushx names2 h (integer) 0 127.0.0.1:6379> rpushx names2 i (integer) 0 127.0.0.1:6379> llen names (integer) 5 127.0.0.1:6379> lset names 2 o OK 127.0.0.1:6379> lindex names 2 "o" 127.0.0.1:6379> len names (error) ERR unknown command 'len' 127.0.0.1:6379> llen names (integer) 5 127.0.0.1:6379> linsert names before h hh (integer) -1 127.0.0.1:6379> linsert names before g gg (integer) 6 127.0.0.1:6379> ltrim names 2 4 OK 127.0.0.1:6379> llen names (integer) 3 127.0.0.1:6379> lpop names "o" 127.0.0.1:6379> lrem names 1 o (integer) 0 127.0.0.1:6379> lpop names "d" 127.0.0.1:6379>
BLPOP key [key ...] timeout:弹出该列表中的第一个元素,或阻塞,直到有一个可用
BRPOP key [key ...] timeout:弹出该列表中的最后一个元素,或阻塞,直到有一个可用
127.0.0.1:6379> lpush names zhangsan lisi wangwu (integer) 3 127.0.0.1:6379> BLPOP names zhangsan 1 1) "names" 2) "wangwu" 127.0.0.1:6379> BRPOP names (error) ERR wrong number of arguments for 'brpop' command 127.0.0.1:6379> BRPOP names 1 1) "names" 2) "zhangsan" 127.0.0.1:6379> BRPOP names 5 1) "names" 2) "lisi" 127.0.0.1:6379> BRPOP names 5 (nil) (5.09s) #没有数据进来的时候,就超时了 127.0.0.1:6379> 127.0.0.1:6379> BRPOP names 50 #这时候处于等待状态 #我们再开启一个客户端 [root@localhost 18:39 ~]# redis-cli 127.0.0.1:6379> lpush names fuwh (integer) 1 127.0.0.1:6379> #这时候,这边就或在阻塞的时候,获取到 1) "names" 2) "fuwh" (20.97s) 127.0.0.1:6379>
RPOPLPUSH source destination:删除列表中的最后一个元素,将其追加到另一个列表
BRPOPLPUSH source destination timeout:弹出一个列表的值,将它推到另外一个列表,并返回它或阻塞,直到有一个可用
127.0.0.1:6379> lpush ages 18 19 20 (integer) 3 127.0.0.1:6379> lpush names zhangsan lisi wangwu (integer) 3 127.0.0.1:6379> llen names (integer) 3 127.0.0.1:6379> llen ages (integer) 3 127.0.0.1:6379> RPOPLPUSH names ages "zhangsan" 127.0.0.1:6379> lpop ages "zhangsan" 127.0.0.1:6379> RPOPLPUSH names ages "lisi" 127.0.0.1:6379> lpop ages "lisi" 127.0.0.1:6379> RPOPLPUSH names ages "wangwu" 127.0.0.1:6379> lpop ages "wangwu" 127.0.0.1:6379> llen ages (integer) 3 127.0.0.1:6379> BRPOPLPUSH names ages 100 #此时names中没有数据,处于阻塞状态 #另外启动一个客户端,给names里面push数据 127.0.0.1:6379> lpush names zhangsan (integer) 1 127.0.0.1:6379> #---------------------------- "zhangsan" (11.47s) 127.0.0.1:6379> llen ages (integer) 4 127.0.0.1:6379> lpop ages "zhangsan" 127.0.0.1:6379>