Redis从入门到入坟系列文章(四): 列表(List)

本文介绍了Redis的列表数据类型List,包括其特点、容量限制以及常用操作如LPUSH、LRANGE、RPUSH、LPOP、RPOP等。通过示例展示了如何在列表中插入、获取、删除元素,以及对列表进行修剪和操作多个列表。此外,还提到了阻塞操作BLPOP和BRPOP,以及LINSERT命令用于在列表中插入元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天了解下Redis的列表数据类型List,List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。如果添加的时候不存在,就会创建一个新的列表;反之,如果删除了列表中的所有元素,这个列表页会被删除。

一个列表最多可以包含 2的32次方 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

接下来,就看一下List的一些常用命令:

1、LPUSH key value1 [value2...]:将一个或多个值插入到列表头部

比如:往mylist插入两个值:“redis”、“mongodb”

127.0.0.1:6379> LPUSH mylist redis mongodb
(integer) 2

2、LRANGE key start stop:获取列表指定范围内的元素

我们获取mylist的元素,这里我们发现添加的第二个值在第一个位置,所以LPUSH操作确实是把值插入到List的头部的。

127.0.0.1:6379> LRANGE mylist 0 2
1) "mongodb"
2) "redis"

3、RPUSH key value1 [value2...]:在列表尾部中添加一个或多个值

这里我们使用RPUSH命令继续往mylist里添加一个值“mysql”

127.0.0.1:6379> RPUSH mylist mysql
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 2
1) "mongodb"
2) "redis"
3) "mysql"

4、LPUSHX key value1 [value2...]:将一个或多个值插入到已存在的列表头部

继续往mylist里插入两个值:“db2”,“oracle”,因为mylist本来存在,所以插入成功

往一个不存在mylist0里插入值“php”,结果返回0,表示命令未生效。

127.0.0.1:6379> LPUSHX mylist oracle db2
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 5
1) "db2"
2) "oracle"
3) "mongodb"
4) "redis"
5) "mysql"
127.0.0.1:6379> LPUSHX mylist0 php
(integer) 0

5、RPUSHX key value1 [value2...]:将一个或多个值插入到已存在的列表尾部

继续往mylist里插入两个值:“java”,“c++”,因为mylist本来存在,所以插入成功

往一个不存在mylist0里插入值“c#”,结果返回0,表示命令未生效。

127.0.0.1:6379> RPUSHX mylist java c++
(integer) 7
127.0.0.1:6379> LRANGE mylist 0 10
1) "db2"
2) "oracle"
3) "mongodb"
4) "redis"
5) "mysql"
6) "java"
7) "c++"
127.0.0.1:6379> RPUSHX mylist0 c#
(integer) 0

6、LLEN key:获取列表长度

 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

127.0.0.1:6379> LLEN mylist
(integer) 7
127.0.0.1:6379> LLEN mylistt
(integer) 0

7、LPOP key:移除并返回列表的第一个元素

我们先移除mylist的第一个元素,然后LRANGE查看该元素已经不在mylist里了。

127.0.0.1:6379> LPOP mylist
"db2"
127.0.0.1:6379> LRANGE mylist 0 10
1) "oracle"
2) "mongodb"
3) "redis"
4) "mysql"
5) "java"
6) "c++"

8、RPOP key:移除列表的最后一个元素,返回值为移除的元素

127.0.0.1:6379> RPOP mylist
"c++"
127.0.0.1:6379> LRANGE mylist 0 10
1) "oracle"
2) "mongodb"
3) "redis"
4) "mysql"
5) "java"

9、LREM key count value:根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。
127.0.0.1:6379> LPUSH mylist2 hello hi day hello hello
(integer) 5
127.0.0.1:6379> LRANGE mylist2 0 10
1) "hello"
2) "hello"
3) "day"
4) "hi"
5) "hello"
127.0.0.1:6379> LREM mylist2 2 hello
(integer) 2
127.0.0.1:6379> LRANGE mylist2 0 10
1) "day"
2) "hi"
3) "hello"

10、LSET key index value:通过索引来设置元素的值

注意:当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

127.0.0.1:6379> LRANGE mylist2 0 10
1) "day"
2) "hi"
3) "hello"
127.0.0.1:6379> LSET mylist2 1 test
OK
127.0.0.1:6379> LRANGE mylist2 0 10
1) "day"
2) "test"
3) "hello"
127.0.0.1:6379> LSET mylist2 4 test
(error) ERR index out of range
127.0.0.1:6379> LSET mylist3 1 test
(error) ERR no such key

11、BLPOP key1 [key2...] timeout:移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

timeout的值是以秒为单位,超出该时间还没找到元素,命令结束,且返回nil

127.0.0.1:6379> LRANGE list3 0 10
(empty list or set)
127.0.0.1:6379> BLPOP list3 10
(nil)
(10.01s)

如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

127.0.0.1:6379> LRANGE list1 0 2
1) "bbb"
2) "aaa"
127.0.0.1:6379> BLPOP list1 10
1) "list1"
2) "bbb"
127.0.0.1:6379> LRANGE list1 0 2
1) "aaa"

该命令会阻塞,同时操作多个list时,只要找到第一个非空的list的就返回,后面的不再执行。

127.0.0.1:6379> LRANGE list3 0 10
(empty list or set)
127.0.0.1:6379> LRANGE list2 0 10
1) "ccc"
2) "bbb"
3) "aaa"
127.0.0.1:6379> BLPOP list3 list2 10
1) "list2"
2) "ccc"
127.0.0.1:6379> LRANGE list3 0 10
(empty list or set)
127.0.0.1:6379> LRANGE list2 0 10
1) "bbb"
2) "aaa"

12、BRPOP key1 [key2...] timeout:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

跟BLPOP类似,唯一区别就是BLPOP是取列表第一个元素,BRPOP是取列表最后一个元素。

127.0.0.1:6379> LRANGE list2 0 10
1) "bbb"
2) "aaa"
127.0.0.1:6379> BRPOP list2 10
1) "list2"
2) "aaa"
127.0.0.1:6379> LRANGE list2 0 10
1) "bbb"

13、BRPOPLPUSH source destination timeout:从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

该命令是从列表中取出最后一个元素,并插入到另外一个列表的头部。

127.0.0.1:6379> LRANGE list3 0 10
(empty list or set)
127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"
2) "bbb"
127.0.0.1:6379> BRPOPLPUSH list2 list3 10
"bbb"
127.0.0.1:6379> LRANGE list3 0 10
1) "bbb"
127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"

 14、LINDEX key index:通过索引获取列表中的元素

注意:Redis的下标都是从左到右为0到length-1,从右到左都是从-1到-length

(integer) 6
127.0.0.1:6379> LRANGE list2 0
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"
5) "eee"
6) "fff"
127.0.0.1:6379> LINDEX list2 0
"aaa"
127.0.0.1:6379> LINDEX list2 -6
"aaa"
127.0.0.1:6379> LINDEX list2 3
"ddd"
127.0.0.1:6379> LINDEX list2 -3
"ddd"

15、LINSERT key BEFORE/AFTER pivot value:在列表的元素前或者后插入元素

对列表list2,在元素“ddd”前插入“hello”,在元素“eee”后插入“world”

127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"
5) "eee"
6) "fff"
127.0.0.1:6379> LINSERT list2 BEFORE ddd hello
(integer) 7
127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"
2) "bbb"
3) "ccc"
4) "hello"
5) "ddd"
6) "eee"
7) "fff"
127.0.0.1:6379> LINSERT list2 AFTER eee world
(integer) 8
127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"
2) "bbb"
3) "ccc"
4) "hello"
5) "ddd"
6) "eee"
7) "world"
8) "fff"

16、LTRIM key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

127.0.0.1:6379> LRANGE list2 0 10
1) "aaa"
2) "bbb"
3) "ccc"
4) "hello"
5) "ddd"
6) "eee"
7) "world"
8) "fff"
127.0.0.1:6379> LTRIM list2 2 6
OK
127.0.0.1:6379> LRANGE list2 0 10
1) "ccc"
2) "hello"
3) "ddd"
4) "eee"
5) "world"

有关列表及其命令的介绍就到这里,虽然很基础,但花个几分钟就能熟练使用常用的命令,还是非常不错的。所以让我们卷起来吧。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值