介绍
- 列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
- 列表类型的内部是双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。一个列表类型最多能容纳2^32-1个元素。
命令
1.向列表两端增加元素
LPUSH key value [value ...]
RPUSH key value [value ...]
LPUSH 命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。
redis> LPUSH numbers 1
(integer) 1
此时numbers键中的数据为:1
LPUSH 命令还支持同时增加多个元素。
redis> LPUSH numbers 2 3
(integer) 3
此时numbers键中的数据为:321
RPUSH 命令用来向列表右边增加元素,用法与 LPUSH 一样。
redis> RPUSH numbers 0 -1
(integer) 5
此时numbers键中的数据为:3 2 1 0 -1
2.从列表两端弹出元素
LPOP key
RPOP key
LPOP 命令可以从列表左边弹出一个元素。LPOP 命令执行有两步操作:第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值。
redis> LPOP numbers
"3"
此时numbers键中的数据为:2 1 0 -1
同样,RPOP 命令可以从列表右边弹出一个元素。
redis> RPOP numbers
"-1"
此时元素的数据为:2 1 0
3.获取列表中元素的个数
LLEN key
当键不存在时 LLEN 会返回 0。
redis> LLEN numbers
(integer) 3
LLEN 命令的功能类似 SQL 语句SELECT COUNT(*) FROM table_name,但是LLEN的时间复杂度为O(1),使用Redis
会直接读取现成的值,而不需要像部分关系数据库那样需要遍历一遍数据表来统计条目数量。
4.获得列表片段
LRANGE key start stop
LRANGE 命令将返回索引从 start 到 stop 之间的所有元素(包含两端的元素)。Redis 的列表起始索引为:0。
redis> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
LRANGE 命令也支持索引,表示从右边开始计算序数,如“-1”表示最右边第一个元素,“-2”表示最右边第二个元素,依此类推。
redis> LRANGE numbers -2 -1
1) "1"
2) "0"
显然,LRANGE numbers 0 -1 可以获取列表中的所有元素。另外一些特殊情况如下。
- 如果 start 的索引位置比 stop 的索引位置靠后,则会返回空列表。
- 如果 stop 大于实际的索引范围,则会返回到列表最右边的元素。
5.删除列表中指定的值
LREM key count value
LREM 命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异。
(1)当 count > 0 时 LREM 命令会从列表左边开始删除前 count 个值为 value 的元素。
(2)当 count > 0 时 LREM 命令会从列表右边开始删除前 count 个值为 value 的元素。
(3)当 count > 0 时 LREM 命令会删除所有值为 value 的元素。
redis> RPUSH numbers 2
(integer) 4
redis> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "2"
# 从右边开始删除第一个值为“2”的元素
redis> LREM numbers -1 2
(integer) 1
redis> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
6.获得/设置指定索引的元素值
LINDEX key index
LSET key index value
如果要将列表类型当作数组来使用,LINDEX命令是必不可少的。
LINDEX命令用来返回指定索引的元素,索引从0开始。
redis> LINDEX numbers 0
"2"
如果index是负数,则表示从右边开始计算的索引,最右边元素的索引是-1。
redis> LINDEX numbers -1
"0"
LSET 是另一个通过索引操作列比的命令,它会将索引为index的元素赋值为value。
redis> LSET numbers 1 7
OK
redis> LINDEX numbers 1
"7"
7.只保留列表指定片段
LTRIM key start end
LTRIM 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。
LTRIM numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
"0"
redis> LTRIM numbers 1 2
OK
redis> LRANGE numbers 0 1
1) "2"
2) "7"
8.向列表中插入元素
LINSERTF key BEFORE|AFTER pivot value
LINSERT 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE 还是 AFTER 来决定将 value 插入到该元素的前面还是后面。
LINSERT 命令的返回值是插入后列表的元素个数。
redis> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "0"
redis> LINSERT numbers AFTER 7 3
(integer) 4
redis> LRANGE numbers 0 -1
1) "2"
2) "7"
3) "3"
4) "0"
redis> LINSERT numbers BEFORE 2 1
(integer) 5
redis> LRANGE numbers 0 -1
1) "1"
2) "2"
3) "7"
4) "3"
5) "0"
9.将元素从一个列表转到另一个列表
RPOPLPUSH source destination
先执行 RPOP 命令再执行 LPUSH 命令。 RPOPLPUSH 命令会先从 source 列表类型键的右边弹出一个元素,然后将其加入到 destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的。
整理自《Redis 入门指南第二版》。