redis的list类型,相当于java中的linkedlist,可从头添加元素,也可从尾添加元素的双端链表的数据结构,提供赋值,取值,添加元素,修改元素,从头部添加元素,从尾部添加元素等命令,接下来,我们看看有哪些常用命令。
- lpush key 值(向一个list类型中左侧开始添加数据,FILO,先进后出)
127.0.0.1:6379> lpush llists a b c d e
(integer) 5
- rpush key 值(向一个list类型中右侧开始添加数据,FIFO,先进先出)
127.0.0.1:6379> rpush rlists f g h i j
(integer) 5
- lrange key 索引start 索引end(从一个list类型中取数据)
127.0.0.1:6379> lrange llists 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"127.0.0.1:6379> lrange rlists 0 -1
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
这里需要注意的是,list的索引从0开始大家知道,但是取全部list的值时,结束索引需要设置为-1,也可以设置成list长度减1
127.0.0.1:6379> lrange rlists 0 4
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
- lpushx key 值(向list中头部开始添加数据)
127.0.0.1:6379> lrange llists 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lpushx llists z
(integer) 6
127.0.0.1:6379> lrange llists 0 -1
1) "z"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
- rpushx key 值(向list中尾部开始添加数据)
127.0.0.1:6379> rpush rlists f g h i j
(integer) 5
127.0.0.1:6379> lrange rlists 0 -1
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
127.0.0.1:6379> rpushx rlists x
(integer) 6
127.0.0.1:6379> lrange rlists 0 -1
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
6) "x"
- llen key (获取list的长度)
127.0.0.1:6379> llen llists
(integer) 6
127.0.0.1:6379> llen rlists
(integer) 6
- lindex key 索引(根据索引下标取得list中的值)
127.0.0.1:6379> lrange llists 0 -1
1) "z"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lindex llists 1
"e"
这里如果下标设置成-1的话,从后边开始取得,java中有越界的异常,而redis的list类型中,如果取得不存在的下标的值,不会抛出异常,返回nil
127.0.0.1:6379> lrange llists 0 -1
1) "z"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"127.0.0.1:6379> lindex llists -1
"a"
127.0.0.1:6379> lindex llists 7
(nil)
127.0.0.1:6379>
- lpop key(删除并弹出list中的第一个元素)
127.0.0.1:6379> lrange llists 0 -1
1) "z"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpop llists
"z"
127.0.0.1:6379> lrange llists 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379>
- rpop key(删除并弹出list中的最后一个元素)
127.0.0.1:6379> lrange rlists 0 -1
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
6) "x"
127.0.0.1:6379> rpop rlists
"x"
127.0.0.1:6379> lrange rlists 0 -1
1) "f"
2) "g"
3) "h"
4) "i"
5) "j"
- blpop key 秒(这里的b呢,是blocking阻塞的意思,就是删除并弹出list中的第一个元素,当元素不存在是,就等待设定的时间,单位是秒)
终端1
127.0.0.1:6379> blpop lists 1
(nil)
(1.08s)127.0.0.1:6379> blpop lists 1000 #这里由于变量lists不存在,一直等待1000秒为止,当其他线程给lists赋值,这里我们在新打开一个连接,为lists设置
终端2
127.0.0.1:6379> lpush lists 1 2 3 4 5
(integer) 5
这是终端1结束阻塞,删除list中的第一个元素
127.0.0.1:6379> blpop lists 1000
1) "lists"
2) "5"
(163.50s)
- brpop key 秒(同样这里的b呢,也是blocking阻塞的意思,就是删除并弹出list中的最后一个元素,当元素不存在是,就等待设定的时间,单位是秒)
终端1
127.0.0.1:6379> brpop l1 1000 #这里由于变量l1不存在,一直等待到1000秒为止,当其他线程给l1赋值,这里我们在新打开一个连接,为l1设置
终端2
127.0.0.1:6379> rpush l1 6 7 8 9 10
(integer) 5
这是终端1结束阻塞,删除l1中的最后一个元素
127.0.0.1:6379> brpop l1 1000
1) "l1"
2) "10"
(95.56s)
- ltrim key 开始索引 结束索引(截取指定范围的值,并重新赋值给key),这里我们生成一个list,并赋值1,2,3,4,5,6,7,8,9,10,截取索引是0到5的值,重新赋值
127.0.0.1:6379> lpush l2 1 2 3 4 5 6 7 8 9 10
(integer) 10
127.0.0.1:6379> lrange l2 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
7) "4"
8) "3"
9) "2"
10) "1"
127.0.0.1:6379> ltrim l2 0 5
OK
127.0.0.1:6379> lrange l2 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
- lset key 索引 修改的值(修改list索引上的值),下边的例子将key是l1的索引0位置上的值修改为1
127.0.0.1:6379> lrange l1 0 -1
1) "6"
2) "7"
3) "8"
4) "9"
127.0.0.1:6379> lset l1 0 1
OK
127.0.0.1:6379> lrange l1 0 -1
1) "1"
2) "7"
3) "8"
4) "9"
- linsert key before|after 已存在的值 要插入的值(大家都知道redis中的list的数据类型相当于java中的linkedlist,而linkedlist对元素的增加,删除的性能非常好,所以linsert是对list中指定的元素的前或后增加数据)
before的例子
127.0.0.1:6379> lrange l1 0 -1
1) "1"
2) "7"
3) "8"
4) "9"
127.0.0.1:6379> linsert l1 before 7 a
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
1) "1"
2) "a"
3) "7"
4) "8"
5) "9"after的例子
127.0.0.1:6379> linsert l1 after 8 b
(integer) 6
127.0.0.1:6379> lrange l1 0 -1
1) "1"
2) "a"
3) "7"
4) "8"
5) "b"
6) "9"
- rpoplpush key1 key2 (把key1的第一个元素,删除并弹出,加入到key2的第一个元素中)
127.0.0.1:6379> lrange l1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lrange l2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpoplpush l1 l2
"a"
127.0.0.1:6379> lrange l1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> lrange l2 0 -1
1) "a"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
这时小伙伴们会有疑问,rpoplpush命令,参数的两个key相同的话怎样,让我们来具体操作下
127.0.0.1:6379> lrange l1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> rpoplpush l1 l1
"b"
127.0.0.1:6379> lrange l1 0 -1
1) "b"
2) "e"
3) "d"
4) "c"
从执行结果能看出,是将list中的最后一个元素,移到最前面
- brpoplpush key1 key2 等待时间(秒单位)(这里前边开头的b是blocking阻塞的意思,当key2中没有要移除的值,会一直阻塞在那里)
终端1
127.0.0.1:6379> keys *
1) "l3"
2) "l2"
3) "l1"
4) "l4"127.0.0.1:6379> brpoplpush l5 l6 1000
终端2
127.0.0.1:6379> lpush l5 1 2 3 4 5
(integer) 5
这是终端1阻塞结束
127.0.0.1:6379> brpoplpush l5 l6 1000
"1"
(232.00s)
list数据类型的基本操作,就介绍到这里。