JAVA全栈Redis篇————List常用命令讲解
🏍️🏍️🏍️引言:List命令的工作原理阐述
前面讲述数据类型概述的时候我们已经说过List的本质是一个双向链表,类似于C++模板库中的Deque,可以从头插入和删除也可以从尾插入和删除
我们来看下图,假设原来的队列是A,B,我们现在要往队头(A的左边)插入C和D,就用LPUSH命令,如果往队尾(B的右边)插入E就用RPUSH命令
那么如果我们要取队头的元素使用LPOP就可以取到队头的D(最左边),要取队尾的元素使用RPOP就可以取到队尾的E(最右边),
🏍️🏍️🏍️深化:从栈的角度深入理解List原理
我们学过数据结构的都知道栈具有后进先出的特点,在使用LPUSH命令存储数据时,我们可以把List看作一个右端封闭的栈,数据存储的顺序和栈的顺序一致,同理,使用RPUSH命令可以把List看作一个左端封闭的栈。
🏍️🏍️🏍️实战:可视化阐述List原理
🍕🍕🍕命令组1:LPUSH,RPUSH,LPOP,LPOP讲解
首先我们使用LPUSH往users中插入1,2,3三个元素,再使用RPUSH继续往users中插入4,5,6三个元素‘
然后我们在图形化界面中观察插入的顺序
如上图所示,先使用的是LPUSH,我们把List看成右端封闭的栈,那么先插入1,1就会在最右边,最后插入3,3就在最左边,所以元素3的id是1,后使用RPUSH我们再把List看成左端封闭,那么1在最右边,所以4,5,6就会依次插入到1后面,并且对应id4,5,6,id编号是从左向右进行的。
然后我们分别使用LPOP和RPOP分别取出队头和队尾元素,分别是3和6,然后取出3再使用LPOP就会把2取出来
🍕🍕🍕命令2:LRANGE
功能:取出指定角标范围内的元素
格式:LRANGE key start stop
下面的命令我们取出了users中角标1到角标3之间的元素
注意,我们下面的ID对应的角标其实是0,1,2所以取1到3的角标只会取出来4,5而不会取出来1
🍕🍕🍕命令3:LLEN
功能:获取列表长度
格式:LLEN key
🍏🍏🍏撑一支长蒿,向青草更青处漫溯:Redis6.2新增命令及阻塞命令的探究
🍬🍬🍬LMPOP命令
Redis6.2新推出命令,功能是可以批量从列表左侧弹出指定数量的元素,用法是LMPOP key 数量,当然在Linux版本的Redis或者高版本windows版的Redist中,LPOP和RPOP就可以直接指定数量,这就是为什么说Linux版本发行的Redis功能更全面,这里本小编用的是3.2版的Redis,版本已经老旧了
🍬🍬🍬LPOP,RPOP和LRANGE的区别
同样是获取元素的命令,带POP的命令会清楚数据库的缓存,获取完元素刷新数据库可以发现数据已经不存在了,而LRANGE则不会清楚数据库的缓存
🍬🍬🍬关于阻塞队列命令BLPOP和BRPOP
功能:同LPOP和RPOP类似,只不过在没有元素时指定等待时间,不直接返回空
格式:BLPOP/BRPOP key 等待时间
我们首先执行一次BLPOP发现报错,因为此时users2中并没有数据,然后我们再次执行并指定一个200s的等待时间
然后我们重新建立一个连接,往users2中插入数据
然后我们再返回到原来的连接发现已经接收到我们插入的数据,这就是阻塞队列的用法
Linux系统还可以显示出等待时间
🍏🍏🍏写在最后:关于三个拓展问题的研究
🍬🍬🍬如何用List模拟一个栈?
入口和出口设置在同一边(都用L或都用R)
🍬🍬🍬如何用List模拟一个队列?
入口和出口设置在不同边
🍬🍬🍬如何用List模拟一个阻塞队列?
入口和出口设置在不同边
出队时采用BLPOP或BRPOP