Redis 数据类型list(列表)

目录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值