list数据类型介绍
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key可以理解为链表的名字。redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样,list既可以作为栈,又可以作为队列。
额,用两个比较通俗的例子描述栈和队列的区别:
栈:就像先往篮子里里面装苹果,装满之后再拿出来,先放进去的,会最后拿出来;后放进去的,最先拿出来。也就是先进后出,后进先出
队列:就像吸管吸果粒一样,从吸管的一头进去,另一头出去,先进入吸管的果粒就会先被吸出去,后进入吸管的,就后备吸出去。即先进先出,后进后出
list数据类型方法
- lpush:在key对应的list的头部添加字符串元素
- rpush:在key对应list的尾部添加字符串元素
- linsert:在key对应list的特定位置前或后添加字符串
- lset:设置list中指定下标的元素值
- lrem:从key对应list中删除n个和value相同的元素(当n>0,表示从头开始删除;当n=0表示全部删除;当n<0,表示从尾部开始删除)
- ltrim:保留指定key的值范围内的数据
- lpop:从list的头部删除元素,并返回已经删除的元素
- rpop:从list的尾部开始依次删除元素,并返回已经删除的元素,与lpop相对应
- rpoplpush:从第一个list的尾部移除元素,并添加到第二个list的头部
- lindex:返回名称为key的list中index位置的元素(即取索引值对应的元素)
- llen:返回key对应list的长度(也就是显示list里面有多少个元素)
方法及操作
1)lpush:在key对应的list的头部添加字符串元素
例如:给list1依次加入元素hello和world
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LPUSH list1 hello
(integer) 1
127.0.0.1:6379> LPUSH list1 world
(integer) 2 #这里的2和上面返回的1不是表示是否成功,而是表示元素的个数,list里面有两个元素
127.0.0.1:6379> LRANGE list1 0 -1 # 0表示开头第一个元素,-1表示list最后一个元素。这句话表示获取list的开头到结尾所有元素
1) "world"
2) "hello" #注意,进去的时候的顺序是hello在前,world在后,但是出来的时候就是world在前,hello在后了。也就是栈
127.0.0.1:6379>
备注,同《系统学习redis之三——redis数据类型之string类型及操作》一样,后面的例子也都在同一台机器一次性操作完毕的,因为后面的代码如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”这一句。代码高亮也会格式有问题,所以后面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是为了格式问题。
2)rpush:在key对应list的尾部添加字符串元素
例如:在list3一次插入hello和world
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> RPUSH list3 hello
(integer) 1
127.0.0.1:6379> RPUSH list3 world
(integer) 2
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello" #这里就是先进先出了,也就是队列
2) "world"
127.0.0.1:6379>
3)linsert:在key对应list的特定位置前或后添加字符串
例如:在list3的world前面加入字符串new1,在world的后面添加字符串new2
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "world"
127.0.0.1:6379>
127.0.0.1:6379> LINSERT list3 before world new1
(integer) 3
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "new1" #在world的前面添加new1添加成功
3) "world"
127.0.0.1:6379> LINSERT list3 after world new2
(integer) 4
127.0.0.1:6379> LRANGE list3 0 -1
1) "hello"
2) "new1"
3) "world"
4) "new2" #在world的后面添加new1添加成功
127.0.0.1:6379>
4)lset:设置list中指定下标的元素值
例如:下面将list5里面下标为1的元素改为four
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LPUSH list5 one
(integer) 1
127.0.0.1:6379> LPUSH list5 two
(integer) 2
127.0.0.1:6379> LPUSH list5 three
(integer) 3
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LSET list5 1 four #将下标为1的元素,改为four
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "four" #原来的two就变成了four
3) "one"
127.0.0.1:6379>
5)lrem:从key对应list中删除n个和value相同的元素(当n>0,表示从头开始删除;当n=0表示全部删除;当n<0,表示从尾部开始删除)
例如:从list5中删除n个元素one
当n为正值,且不等于0,表示从头删除n个和指定值相同的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "one"
4) "one"
5) "two"
6) "three"
7) "four"
127.0.0.1:6379> LREM list5 3 "one" #从list5中删除3个one,最前面的3个one被删除了
(integer) 3 #这里的3,表示的是删除的元素的个数
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379>
当n=0,表示将list里面所有和指定值相同的元素删除掉
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1 #这里设置为0,表示将所有的one都全部删除
1) "one"
2) "one"
3) "three"
4) "four"
127.0.0.1:6379> LREM list5 0 "one"
(integer) 2
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "four"
127.0.0.1:6379>
当n<0,表示从尾部开始删除n个和指定值相同的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "one"
5) "three"
6) "four"
127.0.0.1:6379> LREM list5 -1 "one" #设置赋值-1,就会从尾部开始删除1个one,因此排在最后的那个one就被删除了
(integer) 1
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "three"
5) "four"
127.0.0.1:6379>
6)ltrim:保留指定key的值范围内的数据
例如:保留list5里面指定范围之内的数据
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "one"
4) "two"
5) "three"
6) "four"
127.0.0.1:6379> LTRIM list5 1 4 #保留list5里面下标为1-下标为4的元素,其他的都删除
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "one"
3) "two"
4) "three"
127.0.0.1:6379> LTRIM list5 2 -1 #保留list5里面下标为2-最后一个元素,其他的都删除
OK
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "three"
127.0.0.1:6379>
7)lpop:从list的头部删除元素,并返回已经删除的元素
例如:将list5里面的元素依次删除
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> LPOP list5
"one" #删除的第一个元素是one
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "three"
127.0.0.1:6379> LPOP list5
"two" #删除的第二个元素是two
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
127.0.0.1:6379> LPOP list5
"three" #删除的第三个元素是three
127.0.0.1:6379> LRANGE list5 0 -1 #到最后,list就空了
(empty list or set)
127.0.0.1:6379>
8)rpop:从list的尾部开始依次删除元素,并返回已经删除的元素,与lpop相对应
例如:从尾部依次删除list5的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1 #这是当前list5的所有元素
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> RPOP list5
"one"
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
127.0.0.1:6379> RPOP list5
"two"
127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
127.0.0.1:6379> RPOP list5
"three"
127.0.0.1:6379> LRANGE list5 0 -1 #list5里面的元素已经删除完毕,为空了
(empty list or set)
127.0.0.1:6379>
9)rpoplpush:从第一个list的尾部移除元素,并添加到第二个list的头部
例如:把list5里面最后一个元素移除,并将其添加到list6的头部
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LRANGE list6 0 -1
1) "four"
2) "three"
127.0.0.1:6379> RPOPLPUSH list5 list6 #从下面的结果可以看到,list5尾部的元素“one”已经被移除,并且被添加到了list6的头部字一个元素
"one"
127.0.0.1:6379> LRANGE list5 0 -1
1) "two"
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379>
10)lindex:返回名称为key的list中index位置的元素(即取索引值对应的元素)
例如:取list6中索引值为0、1、2对应的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379> LINDEX list6 0 #这里的0就是索引值,也就是one的下标值
"one"
127.0.0.1:6379> LINDEX list6 1
"four"
127.0.0.1:6379> LINDEX list6 2
"three"
127.0.0.1:6379>
11)llen:返回key对应list的长度(也就是显示list里面有多少个元素)
例如:查询list6里面list长度
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> LRANGE list6 0 -1
1) "one"
2) "four"
3) "three"
127.0.0.1:6379> LLEN list6
(integer) 3 #list6里面有3个元素,所以这里的返回值是3
127.0.0.1:6379>