版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41969845/article/details/108637013
一、前言
在第一篇blog《详谈redis数据结构》中就已讲解过redis的列表结构,常用的一些操作命令也讲解过,也详细解说过列
表的有序和有序集合的有序是不一样的有序,如果还不太清楚的同学可以回头去读。本文将着重详细讲解redis中关于列表的操作命令,使用Java语言来写示例,如果读者对Java语言不熟悉,可以关注文章末尾的微信公众号查看Java系列文章。
二、列表的操作命令
2.1 LRANGE
LRANGE全称:list range
返回[start,end]区间之内的所有元素
(具体示例见下文)
2.2 RPUSH与LPUSH
RPUSH全称 right push
将一个或多个元素推入列表右端
LPUSH全称 left push
将一个或多个元素推入列表左端
//右推
System.out.println(conn.rpush("name1","Kelvin","Oscar","Mike","Eden"));
//返回当前里列表长度
System.out.println(conn.lrange("name1",0,-1));
//左推
System.out.println(conn.lpush("name2","Kelvin","Oscar","Mike","Eden"));
System.out.println(conn.lrange("name2",0,-1));
其中4是当前的列表长度
2.3 RPOP与LPOP
RPOP全称right pop 移除并返回列表最右端元素
LPOP全称left pop 移除并返回列表最左端元素
System.out.println(conn.rpush("name3","Kelvin","Oscar","Mike","Lucy","SeeDou"));
System.out.println(conn.lrange("name3",0,-1));
//右弹
System.out.println(conn.rpop("name3"));
System.out.println(conn.lrange("name3",0,-1));
//左弹
System.out.println(conn.lpop("name3"));
System.out.println(conn.lrange("name3",0,-1));
2.4 LINDEX
LINDEX全称list index
返回列表中指定索引处的位置
System.out.println(conn.lrange("name3",0,-1));
System.out.println(conn.lindex("name3",0));
System.out.println(conn.lindex("name3",1));
System.out.println(conn.lindex("name3",2));
System.out.println(conn.lindex("name3",3));
//列表只有三个元素,所以索引值为3则无元素,返回null
2.5 LTRIM
LTRIM全称:List Trim 列表修建
只保留列表[start,end]之间的元素
System.out.println(conn.rpush("name","Kelvin","Oscar","Mike","Eden","David","Trump","Obama"));
System.out.println(conn.lrange("name",0,-1));
System.out.println(conn.ltrim("name",2,6));
//修建成功返回“OK”
System.out.println(conn.lrange("name",0,-1));
2.6 BLPOP与BRPOP
BLPOP全称:blocking left pop
从第一个非空列表中弹出位于最左端的元素,或者在阻塞timeout秒之内等待可弹出的元素出现。
如下代码,先构建两个列表
age列表中只存一个值
name列表中存入多个值
System.out.println(conn.rpush("age","12"));
System.out.println(conn.rpush("name","Kelvin","Eden","Oscar","Mike"));
System.out.println(conn.lrange("age",0,-1));
System.out.println(conn.lrange("name",0,-1));
System.out.println(conn.blpop(1,"age","name"));
运行第一次,弹出age列表里的12
然后将rpush元素的两行代码注释掉,以防重复push
再运行一次,这时age列表已经是空列表了,那么应该弹出name里面的元素
BRPOP全称block right pop
从第一个非空列表中弹出位于最右端的值,或者在阻塞timeout秒之内等待可弹出的元素出现。
同样,构造两个列表age和name(注意刚刚的列表元素已经被全部抹去了)
age中存两个元素,以便辨别左右,name中存入多个元素
System.out.println(conn.rpush("age","12","13"));
System.out.println(conn.rpush("name","Kelvin","Eden","Oscar","Mike"));
System.out.println(conn.lrange("age",0,-1));
System.out.println(conn.lrange("name",0,-1));
System.out.println(conn.brpop(1,"age","name"));
将rpush那两行注释掉,再运行一次
再运行一次
由此可见,所说的第一个非空列表是从传入参数中从左到右数的,而弹出元素方向在列表中是根据是blpop还是brpop来看的。至于阻塞时间是在实际开发中列表元素的有无是动态的,有可能运行这行代码的那一刻还没有元素但是在一定时间内他会有元素,所以可以设置一个阻塞时间来弹出这个可能出现的元素。这不得不说,redis的功能相当强大。
2.7 RPOPLPUSH
rpoplpush全称right pop list push
RPOPLPUSH source-key dest-key 从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
构建两个列表rich和poor,各push若干元素
System.out.println(conn.rpush("rich","Joy","Jone","Jun")); System.out.println(conn.rpush("poor","Kelvin","Eden","Oscar","Mike"));
System.out.println(conn.lrange("rich",0,-1));
System.out.println(conn.lrange("poor",0,-1));
System.out.println(conn.rpoplpush("rich","poor"));
System.out.println(conn.lrange("rich",0,-1));
System.out.println(conn.lrange("poor",0,-1));
2.8 BRPOPLPUSH
BRPOPLPUSH比RPOPLPUSH多了一个可阻塞功能,就不单独再写测试用例了。读者可自行测试。
总结
redis的列表命令还是蛮多的,熟练掌握命令的操作对日后的开发肯定大有帮助。列表的一个主要优点就是在于它可以包含多个1字符串值,这使得用户可以将数据集中在同一个地方。
对Java系列知识感兴趣的朋友可以加入QQ群
慧梦软件开发技术联盟:952317701
更多系列文章在java高级程序开发微信公众号