今天了解下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"
有关列表及其命令的介绍就到这里,虽然很基础,但花个几分钟就能熟练使用常用的命令,还是非常不错的。所以让我们卷起来吧。。。