目录
1 基本特性
2 主要操作命令
2.1 LPUSH key value [value ...]
2.2 RPUSH key value [value ...]
2.3 LRANGE key start stop
2.4 LINDEX key index
2.5 LLEN key
2.6 LPOP key
2.7 RPOP key
2.8 LTRIM key start stop
2.9 BLPOP key [key ...] timeout
2.10 BRPOP key [key ...] timeout
2.11 LINSERT key BEFORE|AFTER pivot value
2.12 LSET key index value
2.13 RPOPLPUSH source destination
2.14 LREM key count value
Redis 的列表(List)是一种数据结构,它按照插入顺序存储字符串元素。列表是有序的,这意味着元素在列表中的位置是有意义的,并且可以被索引。列表非常适合用来实现队列和栈这样的数据结构。以下是 Redis 列表的一些主要特性和操作:
1 基本特性
- 有序集合:列表中的元素按照插入顺序排序。
- 元素类型:列表中的每个元素都是字符串,但这些字符串可以包含任何二进制数据,包括序列化的其他数据结构。
- 动态大小:列表的长度是可以变化的,可以根据需要添加或删除元素。
- 高效访问:可以在 O(1) 时间内访问列表两端的元素,但是访问中间元素的时间复杂度为 O(N)。
- 内存优化:Redis 会尝试对小整数进行编码以节省空间。
- 列表长度:理论上,每个列表最多可以存储 2^32 - 1 个元素(超过40亿个),因为列表内部使用的是一个双向链表结构。
2 主要操作命令
2.1 LPUSH key value [value ...]
将一个或多个值插入到列表的头部(左边)。
127.0.0.1:6379> lpush name java
(integer) 1
127.0.0.1:6379> lpush name python
(integer) 2
127.0.0.1:6379> lrange name 0 -1
1) "python"
2) "java"
2.2 RPUSH key value [value ...]
将一个或多个值插入到列表的尾部(右边)。
127.0.0.1:6379> rpush name c++
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "python"
2) "java"
3) "c++"
2.3 LRANGE key start stop
获取列表中从 start
到 stop
之间的所有元素(包含 start
和 stop
位置上的元素)。为了获取整个列表,你可以设置起始索引为 0(列表的第一个元素),结束索引为 -1(列表的最后一个元素)。
127.0.0.1:6379> lrange name 0 -1
1) "python"
2) "java"
3) "c++"
2.4 LINDEX key index
获取列表中指定索引处的元素(0 是列表的第一个元素,-1 是最后一个元素)。
127.0.0.1:6379> lindex name 2
"c++"
2.5 LLEN key
返回列表的长度。
127.0.0.1:6379> llen name
(integer) 3
2.6 LPOP key
移除并返回列表的第一个元素(从左端)。
127.0.0.1:6379> lrange name 0 -1
1) "python"
2) "java"
3) "c++"
127.0.0.1:6379> lpop name
"python"
127.0.0.1:6379> lrange name 0 -1
1) "java"
2) "c++"
2.7 RPOP key
移除并返回列表的最后一个元素(从右端)。
127.0.0.1:6379> lrange name 0 -1
1) "java"
2) "c++"
127.0.0.1:6379> rpop name
"c++"
127.0.0.1:6379> lrange name 0 -1
1) "java"
2.8 LTRIM key start stop
保留列表中从 start
到 stop
之间的元素,移除其它所有元素。
127.0.0.1:6379> lrange name 0 -1
1) "python"
2) "c++"
3) "go"
4) "java"
127.0.0.1:6379> ltrim name 1 2
OK
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "go"
2.9 BLPOP key [key ...] timeout
阻塞版本的 LPOP
,如果列表为空,则阻塞连接直到有新的元素被添加到列表或者超时。
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "go"
127.0.0.1:6379> blpop name 5
1) "name"
2) "c++"
127.0.0.1:6379> lrange name 0 -1
1) "go"
127.0.0.1:6379> blpop user 5
(nil)
(5.07s)
2.10 BRPOP key [key ...] timeout
阻塞版本的 RPOP
,行为与 BLPOP
类似,但是从列表的右端弹出元素。
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "go"
127.0.0.1:6379> brpop name 5
1) "name"
2) "go"
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2.11 LINSERT key BEFORE|AFTER pivot value
将 value 插入到列表中 pivot 元素之前或之后,如果 pivot 不存在于列表中,则不进行任何操作。
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "go"
3) "python"
4) "java"
127.0.0.1:6379> linsert name after python .net
(integer) 5
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "go"
3) "python"
4) ".net"
5) "java"
127.0.0.1:6379> linsert name before go js
(integer) 6
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "js"
3) "go"
4) "python"
5) ".net"
6) "java"
127.0.0.1:6379> linsert name after c# rube
(integer) -1
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "js"
3) "go"
4) "python"
5) ".net"
6) "java"
2.12 LSET key index value
设置列表中指定索引位置的元素为新值,如果索引超出范围,则返回错误。
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "js"
3) "go"
4) "python"
5) ".net"
6) "java"
127.0.0.1:6379> lset name 1 basic
OK
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "basic"
3) "go"
4) "python"
5) ".net"
6) "java"
127.0.0.1:6379> lset name 7 basic
(error) ERR index out of range
2.13 RPOPLPUSH source destination
原子地执行两个操作,移除列表的最后一个元素,并将该元素添加到另一个列表并返回,这对于实现队列间的原子移动非常有用。
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "basic"
3) "go"
4) "python"
5) ".net"
6) "java"
127.0.0.1:6379> lrange name1 0 -1
1) "html"
2) "ts"
3) "js"
127.0.0.1:6379> rpoplpush name name1
"java"
127.0.0.1:6379> lrange name 0 -1
1) "c++"
2) "basic"
3) "go"
4) "python"
5) ".net"
127.0.0.1:6379> lrange name1 0 -1
1) "java"
2) "html"
3) "ts"
4) "js"
2.14 LREM key count value
从列表中移除等于给定值的元素,count
参数决定了删除多少个匹配的元素:
count > 0
:从头到尾搜索,移除count
个匹配的元素。count < 0
:从尾到头搜索,移除-count
个匹配的元素。count = 0
:移除所有匹配的元素。
127.0.0.1:6379> lrange number 0 -1
1) "5"
2) "4"
3) "3"
4) "3"
5) "6"
6) "5"
7) "4"
8) "3"
127.0.0.1:6379> lrem number -2 3
(integer) 2
127.0.0.1:6379> lrange number 0 -1
1) "5"
2) "4"
3) "3"
4) "6"
5) "5"
6) "4"
127.0.0.1:6379> lrem number 1 4
(integer) 1
127.0.0.1:6379> lrange number 0 -1
1) "5"
2) "3"
3) "6"
4) "5"
5) "4"
127.0.0.1:6379> lrem number 0 5
(integer) 2
127.0.0.1:6379> lrange number 0 -1
1) "3"
2) "6"
3) "4"
更多命令请参考:Commands | Docs