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' 上面的操作代表的意思是首先我往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' 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 这里有一点需要注意,就是如果list中如果有2个或者多个相同的值,那么执行before会是什么情况?这个大家可以自己测试,记住一点,before是从list的头开始算起的,遇到的第一个为准。 关于链表的头尾,记住一个规则,从尾到头为向上,永远指向头的方向为前。 5.lset listkey flag value:设定listkey中指定下标flag的元素值替换为value 上面首先存储一个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> lrem listkey5 2 four 大家仔细琢磨一下上面的一系列操作吧。 lrem结果成功返回删除掉的记录数,如果失败返回0 7.ltrim listkey start end:保留指定的listkey的值范围内的数据,从start开始到end结束,其他元素会全部删除掉 127.0.0.1:6379> lrange listkey4 0 -1 127.0.0.1:6379> ltrim listkey4 2 3 注意start到end是保留的范围而不是删除的范围。 8.lpop/rpop listkey:从listkey的list的头/尾部删除元素,并且返回删除的元素。返回值是被删除的元素值 127.0.0.1:6379> lrange listkey4 0 -1 127.0.0.1:6379> lpop listkey4 9.rpoplpush listkey1 listkey2:从listkey1的尾部弹出元素并且添加到listkey2的头部。返回结果成功是是被弹出的元素value 127.0.0.1:6379> lrange listkey5 0 -1 10.lindex listkey index:返回listkey对应的链表中,index位置的value。index位置从头开始算起。index可以是负数,如果是负数证明是从尾开始算起。 127.0.0.1:6379> lrange listkey6 0 -1 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" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |