设为首页 收藏本站
查看: 851|回复: 0

[经验分享] 系统学习redis之五——redis数据类型之list类型及操作

[复制链接]

尚未签到

发表于 2018-11-2 07:57:24 | 显示全部楼层 |阅读模式
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 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 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 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>



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629584-1-1.html 上篇帖子: 系统学习redis之四——redis数据类型之hash类型及操作 下篇帖子: 系统学习redis之六——redis数据类型之set数据类型及操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表