list类型
介绍
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的)。
命令
1.向列表两端增加元素
LPUSH key value [value …]
RPUSH key value [value …]
LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
向列表右边增加元素的话则使用RPUSH命令,其用法和LPUSH命令一样
demo
127.0.0.1:6380> lpush list1 0 1 2 3 4
127.0.0.1:6380> rpush list1 -1 -2 -3 -4
127.0.0.1:6380> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "0"
6) "-1"
7) "-2"
8) "-3"
9) "-4"
2.从列表两端弹出元素
LPOP key
RPOP key
有进有出,LPOP命令可以从列表左边弹出一个元素。LPOP命令执行两步操作:第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值。
demo
127.0.0.1:6380> lpop list1
"4"
127.0.0.1:6380> rpop list1
"-4"
127.0.0.1:6380> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
5) "-1"
6) "-2"
7) "-3"
3.获取列表中元素的个数
LLEN key
demo
127.0.0.1:6380> llen list1
(integer) 7
127.0.0.1:6380> llen list2
(integer) 0
4.获得列表片段
LRANGE命令是列表类型最常用的命令之一,它能够获得列表中的某一片段。LRANGE命令将返回索引从start到stop之间的所有元素(包含两端的元素)。
LRANGE命令在取得列表片段的同时不会像LPOP一样删除该片段
LRANGE key start stop
demo
lrange list1 0 2
127.0.0.1:6380> lrange list1 0 2
1) "3"
2) "2"
3) "1"
LRANGE命令也支持负索引,表示从右边开始计算序数,如"-1"表示最右边第一个元
素,"-2"表示最右边第二个元素,依次类推:
demo
127.0.0.1:6380> lrange list1 -4 -1
1) "0"
2) "-1"
3) "-2"
4) "-3"
5.删除列表中指定的值
LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根
据count值的不同,LREM命令的执行方式会略有差异:
●当count>0时LREM命令会从列表左边开始删除前count个值为value的元素;
●当count<0时LREM 命令会从列表右边开始删除前|count|个值为value的元素;
●当count=0是LREM命令会删除所有值为value的元素。例如:
demo
127.0.0.1:6380> lpush list2 3 2 1 0 1 2 3
(integer) 7
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
5) "1"
6) "2"
7) "3"
127.0.0.1:6380> lrem list2 1 2
(integer) 1
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "0"
4) "1"
5) "2"
6) "3"
127.0.0.1:6380> lrem list2 -1 2
(integer) 1
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "0"
4) "1"
5) "3"
6.获得/设置指定索引的元素值
LINDEX key index
LSET key index value
LINDEX命令用来返回指定索引的元素,索引从0开始
如果index是负数则表示从右边开始计算的索引,最右边元素的索引是-1
demo
127.0.0.1:6380> lindex list1 2
"1"
127.0.0.1:6380> lindex list1 -1
"-3"
LSET是另一个通过索引操作列表的命令,它会将索引为index的元素赋值为value
127.0.0.1:6380> lset list1 1 7
OK
127.0.0.1:6380> lindex list1 1
"7"
127.0.0.1:6380> lset list1 -1 6
OK
127.0.0.1:6380> lindex list1 -1
"6"
7.只保留列表指定片段
LTRIM key start end
LTRIM命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同
demo
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "0"
4) "1"
5) "3"
127.0.0.1:6380> ltrim list2 0 2
OK
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "0"
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
LINSERT命令的返回值是插入后列表的元素个数。
demo
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "0"
127.0.0.1:6380> linsert list2 after 1 rex
(integer) 4
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "1"
3) "rex"
4) "0"
127.0.0.1:6380> linsert list2 before 1 yang
(integer) 5
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "yang"
3) "1"
4) "rex"
5) "0"
9.将元素从一个列表转到另一个列表
RPOPLPUSH source destination
demo
127.0.0.1:6380> lrange list2 0 -1
1) "3"
2) "yang"
3) "1"
4) "rex"
5) "0"
127.0.0.1:6380> lrange list3 0 -1
(empty list or set)
127.0.0.1:6380> rpoplpush list2 list3
"0"
127.0.0.1:6380> lrange list3 0 -1
1) "0"
127.0.0.1:6380> rpoplpush list2 list3
"rex"
127.0.0.1:6380> lrange list3 0 -1
1) "rex"
2) "0"
127.0.0.1:6380> lrange list3 0 -1
1) "rex"
2) "0"
源和目标一致
127.0.0.1:6380> lrange list3 0 -1
1) "rex"
2) "0"
127.0.0.1:6380> rpoplpush list3 list3
"0"
127.0.0.1:6380> lrange list3 0 -1
1) "0"
2) "rex"