NoSQL之Redis对lists类型的操作

一、简介

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中的key理解为链表的名字。Redis的list类型其实就是一个每一个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,也可以作为队列。

二、栈跟队列的特性

1.栈:先进后出。如果把1,2,3放到栈中,那么顺序是3,2,1 1的方向是栈的头,3所在的是栈的尾。如果想从栈里把1拿出来,那么先拿3再2再1.

2.队列:先进先出,相当于一个管道,同样防1,2,3,那么出也是1,2,3。

三、list类型的相关操作

1.lpush listkey value:listkey对应list的头部添加value。

127.0.0.1:6379> lpush listkey1 'world'
(integer) 1
127.0.0.1:6379> lpush listkey1 'hello'
(integer) 2
127.0.0.1:6379> lrange listkey1 0 -1
1) "hello"
2) "world"

上面的操作代表的意思是首先我往listkey1的头压入一个world字符串,接着往它的头压入hello,然后用lrange取出listkey1中的全部数据,可以看到listkey1中从头到尾依次是hello,world。lrange listkey1 0 -1是指从listkey1中从第0个元素取到最后一个元素(从头取到尾)。

2.rpush listkey value:从listkey的尾部压入元素value

127.0.0.1:6379> rpush listkey2 'hello'
(integer) 1
127.0.0.1:6379> rpush listkey2 'world'
(integer) 2
127.0.0.1:6379> lrange listkey2 0 -1
1) "hello"
2) "world"

3.lrange listkey start end:取listkey里面的值从start取到end

4.linsert listkey before/after value1 value2:从listkey的头开始,在value1的前/后面压入value2

127.0.0.1:6379> lpush listkey3 v1
(integer) 1
127.0.0.1:6379> lpush listkey3 v2
(integer) 2
127.0.0.1:6379> lpush listkey3 v3
(integer) 3
127.0.0.1:6379> lpush listkey3 v4
(integer) 4
127.0.0.1:6379> lrange listkey3 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> linsert listkey3 before v1 v5
(integer) 5
127.0.0.1:6379> lrange listkey3 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v5"
5) "v1"

这里有一点需要注意,就是如果list中如果有2个或者多个相同的值,那么执行before会是什么情况?这个大家可以自己测试,记住一点,before是从list的头开始算起的,遇到的第一个为准。

关于链表的头尾,记住一个规则,从尾到头为向上,永远指向头的方向为前。

5.lset listkey flag value:设定listkey中指定下标flag的元素值替换为value
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lset listkey4 2 four
OK
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"
3) "four"

上面首先存储一个listkey4链表,用从头压入的方法压入3个元素one,two,three,这样three对应的下标是0,two对应的是1,one对应的是2,因为是从头压入的。所以用lset listkey4 2 four实际上是把one替换成了four。再用larange listkey4 0 -1从头到尾取的时候自然就得到了three two four

6.lrem listkey n value:listkey的list中删除n个和value相同的值(n < 0从尾删除,n=0全部删除)。
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "four"
3) "four"
4) "three"
5) "two"
6) "two"
7) "one"
8) "one"
9) "one"

127.0.0.1:6379> lrem listkey5 2 four
(integer) 2
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"
6) "one"
7) "one"
127.0.0.1:6379> lrem listkey5 -2 one
(integer) 2
127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"

大家仔细琢磨一下上面的一系列操作吧。

lrem结果成功返回删除掉的记录数,如果失败返回0

7.ltrim listkey start end:保留指定的listkey的值范围内的数据,从start开始到end结束,其他元素会全部删除掉

127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "three"
3) "three"
4) "two"
5) "four"

127.0.0.1:6379> ltrim listkey4 2 3
OK
127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"

注意start到end是保留的范围而不是删除的范围。

8.lpop/rpop listkey:从listkey的list的头/尾部删除元素,并且返回删除的元素。返回值是被删除的元素值

127.0.0.1:6379> lrange listkey4 0 -1
1) "three"
2) "two"

127.0.0.1:6379> lpop listkey4
"three"
127.0.0.1:6379> lrange listkey4 0 -1
1) "two"

9.rpoplpush listkey1 listkey2:从listkey1的尾部弹出元素并且添加到listkey2的头部。返回结果成功是是被弹出的元素value

127.0.0.1:6379> lrange listkey5 0 -1
1) "four"
2) "three"
3) "two"
4) "two"
5) "one"
127.0.0.1:6379> lrange listkey6 0 -1
1) "two"
2) "one"
127.0.0.1:6379> rpoplpush listkey5 listkey6
"one"
127.0.0.1:6379> lrange listkey6 0 -1
1) "one"
2) "two"
3) "one"

10.lindex listkey index:返回listkey对应的链表中,index位置的value。index位置从头开始算起。index可以是负数,如果是负数证明是从尾开始算起。

127.0.0.1:6379> lrange listkey6 0 -1
1) "one"
2) "two"
3) "one"
127.0.0.1:6379> lindex listkey6 0
"one"
127.0.0.1:6379> lindex listkey6 1
"two"

11.llen listkey:返回listkey中元素的个数,返回值是一个integer

127.0.0.1:6379> llen listkey5 (integer) 4 127.0.0.1:6379> lrange listkey5 0 -1 1) "four" 2) "three" 3) "two" 4) "two"

相关文章

文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的...
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒...
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb...
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn...
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无...