Redis的指令组(二)

简介

本篇文章将介绍redis的lists数据类型的指令组。redis中Lists是按插入顺序排序的字符串元素的集合。其底层实现是链表,这意味着lists在头尾插入元素会非常快,但是无法向数组那样通过下标快速的访问某个元素。通过redis的lists命令组可以很方便的实现一个栈,队列等数据结构。

lists命令组

LPUSH 、RPUSH

lpush和rpush都是向一个链表头中添加一个或者多个元素,不同的是lpush从左边开始添加,rpush从右边开始添加。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LPOP、RPOP

LPOP和RPOP都是移除并返回一个key对应的list的第一个元素。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的命令,当从同一边push和pop时是典型的栈结构,比如对于某个key,只是用lpop和lpush。
当从一边push从另一边pop时是典型队列结构。

BLPOP、BRPOP

blpop、brpop是lpop、rpop的阻塞版本,即当给定的列表里面没有元素时,命令将被阻塞。当指定多个key时,则按参数的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。由于blpop与brpop只是弹出的左右元素不同,所以后面以blpop命令为例。
在这里插入图片描述
blpop 除了接受多个key以外还需要一个超时时间timeout单位为 秒,当为0时表示若没有元素可弹出则永远阻塞下去。

在这里插入图片描述

通过上面的结果可知,blpop与lpop不同的地方是,blpop会把key也返回给客户端。

在这里插入图片描述
通过上面的结果可知:当指定多个key时,则按参数的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
在这里插入图片描述
通过上面的结果可知当等待超时时会返回nil。

注意:

  • 如果多个客户端被同一个key阻塞住,redis会将这些客户端按先来后到的顺序排好队,当key中有元素时第一个请求的客户端会取到元素返回,其他的客户端继续阻塞。若该客户端取完元素后继续通过blpop取元素时,那么该客户端需要重新排队。
  • 当客户端正在被某个key阻塞住时,若通过push命令一次传多个值的时候,redis在2.6版本以后和之前的处理方式是不一样的。2.6版本以后会将所有的元素都push到list中后再响应阻塞,2.4版本之前则是在push的过程中响应阻塞。比如: 执行 lpush k1 a b c 后,2.6版本以后的对于被blpop阻塞的客户端会弹出c,因为执行完lpush后 k1的value是 cba 然后弹出最左端的元素c。2.4版本的会弹出a因为a进入list后redis就会响应阻塞。

LPUSHX、RPUSHX

lpushx和rpushx是只有当 key 已经存在并且存着一个 list 的时候,在这个 key 下面的 list 的头部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。

在这里插入图片描述

RPOPLPUSH、BRPOPLPUSH

rpoplpush source destination 该命令接受两个参数,其会原子性的返回并且移除source的最后一个元素(最右端)的元素,并把该元素放到destination列表的第一个(最左端)元素的位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该命令可以实现一个安全的队列。所谓安全就是:当生产者将消息放入source_queue后,消费者必然会通过rpop取出消息。但是在这个过程中消息可能会在网络中丢失,或者消息还没处理完消费者服务器宕机了,这就造成了这条消息没有处理而丢失消息。
如果消费者使用rpoplpush命令在取出消息后,同时将该消息存入另一个destination_queue中,当消息被处理了之后在通过lrem命令将该消息移除。同时添加一个客户端来监控这个destination_queue,如果有某些消息已经存在很长时间了,那么这个客户端会把这些消息重新加入到source_queue中。
如果source_queue和destination_queue是同一个列表时,那么可以实现一个循环列表。当我们需要循环的对某些元素做处理的时候可以使用这中方式。即使在并发的情况下也不会出错,因为该命令保证原子性。
brpoplpush是rpoplpush的阻塞版本。当source_queue为空的时候,那么命令会一直阻塞下去(或者超时)直到有其他线程向source_queue中放入元素。

LINDEX、LRANGE

lindex与lrange都是根据下标获取list里的元素(这里的首字母L并不是left的缩写而是list的缩写),下标从左到右是从0开始的,下标右到左是从-1开始的。
lindex是根据下标返回该下标的元素,只返回一个元素。
lrange是根据起始下标和终止返回范围内的元素列表。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

LINSERT、LSET

linsert 把 一个元素插入到指定值的前面或者后面。当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。当 key 存在,但保存的不是一个list的时候,会返回error。
lset 将下标为index设置为value。当index超出范围时会返回一个error。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LLEN

llen会返回指定key的list的长度,如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
在这里插入图片描述

在这里插入图片描述

LREM

lrem key count value 命令会从存于key的list里面移除前count次出现的值为value的元素。

  • count > 0 :从左向右移除值为value的元素。
  • count < 0 :从右向左移除值为value的元素。
  • count = 0 :移除所有值为value的元素。
    当key不存在时命令返回0

在这里插入图片描述

LTRIM

ltrim key start stop 命令会限制key的长度为 stop - start 大小同时会移除start前面的和stop后面的值。

  • 若start > stop 则会使列表变为空
  • 若stop超过key目前的长度,还是会保留最后一个元素

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值