列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素、或者获取列表某一个片段。
Redis的列表类型是使用双向链表实现的。向两端添加、删除元素的时间复杂度为O(1)。
1、向两端添加、删除元素
格式
redis> LPUSH key value [value …] # 向列表左端添加元素
redis> RPUSH key value [value …] # 向列表右端添加元素
redis> LPOP key # 弹出列表左端第一个元素,会删除元素
redis> RPOP key # 弹出列表右端第一个元素,会删除元素
举例
127.0.0.1:6379> LPUSH numbers 0
(integer) 1
127.0.0.1:6379> LPUSH numbers 1 2
(integer) 3
127.0.0.1:6379> RPUSH numbers -1
(integer) 4
127.0.0.1:6379> LPUSH numbers 3
(integer) 5
127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> RPOP numbers
"-1"
注:LPUSH和RPUSH返回的结果是列表中的元素个数;LPOP和RPOP返回的结果是弹出的元素值
2、获取列表元素个数
格式
redis> LLEN key
举例
127.0.0.1:6379> LLEN numbers
(integer) 3
3、获取列表片段
格式
redis> LRANGE key start stop # 返回索引从start到stop之间的所有元素(包括两端元素)
举例
127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LRANGE numbers 0 1
1) "2"
2) "1"
127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
注:LRANGE命令支持负索引,表示从右边开始计算,如“-1”表示最右边第一个元素,以此类推。
如果start > stop:返回空列表。
如果stop > 实际索引范围:返回到列表最右边的元素。
4、删除列表中指定的值
格式
redis> LREM key count value # 删除列表中前count个值为value的元素
注:
(1)count > 0时,LREM命令会从列表左边开始删除前count个值为value的元素;
(2)count < 0时,LREM命令会从泪奔右边开始删除前count个值为value的元素;
(3)count = 0时,LREM命令会删除所有值为value的元素
举例
127.0.0.1:6379> RPUSH numbers 2
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "2"
127.0.0.1:6379> LREM numbers -1 2
(integer) 1
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> RPUSH numbers 1
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "1"
127.0.0.1:6379> LREM numbers 1 2
(integer) 1
127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
3) "1"
127.0.0.1:6379> LREM numbers 0 1
(integer) 2
127.0.0.1:6379> LRANGE numbers 0 -1
1) "0"
5、获取/设置指定索引的元素值
格式
redis> LINDEX key index # 获取指定索引index的元素值
redis> LSET key index value # 设置指定索引indee的元素值为value
举例
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "0"
127.0.0.1:6379> LINDEX numbers 1
"3"
127.0.0.1:6379> LSET numbers 1 6
OK
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "6"
3) "2"
4) "1"
5) "0"
6、只保留列表指定片段的元素值
格式
redis> LTRIM key start end # 该命令会删除指定索引范围外的所有元素
举例
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "6"
3) "2"
4) "1"
5) "0"
127.0.0.1:6379> LTRIM numbers 0 2
OK
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "6"
3) "2"
7、向列表插入元素
格式
redis> LINSERT key BEFORE|AFTER pivot value
注:该命令会从左到右查找值为pivot的第一个元素,然后根据第二个参数是BEFORE或AFTER来决定将value插入到该元素的前面还是后面。返回结果为列表元素个数。
举例
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "6"
3) "2"
127.0.0.1:6379> LINSERT numbers BEFORE 6 5
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "5"
3) "6"
4) "2"
127.0.0.1:6379> LINSERT numbers AFTER 6 7
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "2"
8、将元素从一个列表转到另一个列表
格式
redis> RPORLPUSH source destination
注:从该命令的名字可以看出,其先执行RPOP命令在执行LPUSH命令
举例
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "2"
127.0.0.1:6379> RPOPLPUSH numbers numbers_new
"2"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "4"
2) "5"
3) "6"
4) "7"
127.0.0.1:6379> LRANGE numbers_new 0 -1
1) "2"