Redis---列表

  • Redis中列表类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储232 - 1个元素。

  • 列表中的数据会按照插入顺序进行排序。不过,该列表的底层实际是一个无头节点的双向链表,所以对列表表头与表尾的操作性能较高,但对中间元素的插入与删除的操作的性能相对较差。

  • 在一般要求顺序的业务中,一般都用list来实现。

命令

  1. lpush/rpush
  • 格式:lpush key value [value …] 或 rpush key value [value …]
  • 功能:将一个或多个值 value 插入到列表 key 的表头/表尾(表头在左,表尾在右)
  • 说明:如果有多个 value 值,对于 lpush 来说,各个 value 会按从左到右的顺序依次插入到表头;对于 rpush 来说,各个 value 会按从左到右的顺序依次插入到表尾。如果 key不存在,一个空列表会被创建并执行操作。当 key 存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。

image-20230409160957748

  1. llen
  • 格式:llen key
  • 功能:返回列表 key 的长度。
  • 说明:如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。

image-20230409165829469

  1. lindex
  • 格式:lindex key index
  • 功能:返回列表 key 中,下标为 index 的元素。列表从 0 开始计数。
  • 说明:如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。

image-20230409170027705

  1. lset
  • 格式:lset key index value
  • 功能:将列表 key 下标为 index 的元素的值设置为 value 。
  • 说明:当 index 参数超出范围,或对一个空列表(key 不存在)进行 lset 时,返回一个错误。

image-20230409170202317

  1. lrange
  • 格式:lrange key start stop
  • 功能:返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。
  • 说明:List 的下标从 0 开始,即以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 还要大,那么 lrange 返回一个空列表。如果 stop 下标比最大下标还要大,Redis 将 stop 的值设置为最大下标。
图片.png
  1. lpushx 与 rpushx
  • 格式:lpushx key value 或 rpushx key value
  • 功能:将值 value 插入到列表 key 的表头/表尾,当且仅当 key 存在并且是一个列表。
  • 说明:当 key 不存在时,命令什么也不做。若执行成功,则输出表的长度。

image-20230409170626964

image-20230409170740239
  1. linsert
  • 格式:linsert key [ before | after ] pivot value
  • 功能:将值 value 插入到列表 key 当中,位于元素 pivot 之前或之后。
  • 说明:当 pivot 元素不存在于列表中时,不执行任何操作,返回-1;当 key 不存在时,key 被视为空列表,不执行任何操作,返回 0;如果 key 不是列表类型,返回一个错误;如果命令执行成功,返回插入操作完成之后,列表的长度。

image-20230409171047424

image-20230409171235278

  1. lpop 与 rpop
  • 格式:lpop key [count] 或 rpop key [count]
  • 功能:从列表 key 的表头/表尾移除 count 个元素,并返回移除的元素。count 默认值 1。
  • 说明:当 key 不存在时,返回 nil。
image-20230409171707402
  1. blpop 与 brpop
  • 格式:blpop key [key …] timeout 或 brpop key [key …] timeout

  • 功能:blpop / brpop是列表的阻塞式(blocking)弹出命令。它们是 lpop / rpop 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 blpop / brpop命令阻塞,直到等待 timeout 超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。

  • 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

    1. list1,list2和list3均为空列表,blpop会从左向右依次检查这三个列表是否为空,如果不为空就返回那个列表的第一个元素和那个列表的名字。

    2. list1,list2和list3均为空列表,会阻塞30s。在30s的时间内,向list2插入元素(c,b,a),blpop检测到list2中存在元素,并pop掉list2头部的第一个元素。pop之后阻塞被解除。

      image-20230409174641561

      image-20230409174259431

brpop也是类似,只不过pop的是列表尾部的第一个元素。

  1. rpoplpush
  • 格式:rpoplpush source destination
  • 功能:命令 rpoplpush 在一个原子时间内,执行以下两个动作:将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。如果 source 不存在,值 nil 被返回,并且不执行其他动作。如果 source 和 destination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
image-20230409175458729
  1. brpoplpush
  • 格式:brpoplpush source destination timeout
  • 功能:brpoplpush 是 rpoplpush 的阻塞版本,当给定列表 source 不为空时,brpoplpush的表现和 rpoplpush一样。当列表 source 为空时, brpoplpush命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 lpush或 rpush命令为止。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
  • 说明:假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
image-20230409175808657

image-20230409175852342

sour2和dest2原本均为空。在15秒之内,向sour2插入元素(a,b,c),brpoplpush 指令将c这个元素从sour2中弹出,插入到dest2中,并解除阻塞。

  1. lrem
  • 格式:lrem key count value

  • 功能:根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:

    • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    • count = 0 : 移除表中所有与 value 相等的值。
  • 说明:返回被移除元素的数量。当 key 不存在时, lrem命令返回 0 ,因为不存在的 key 被视作空表(empty list)。

image-20230409180507600
  1. ltrim
  • 格式:ltrim key start stop
  • 功能:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  • 说明:下标(index)参数支持正数索引和负数索引。当 key 不是列表类型时,返回一个错误。如果 start 下标比列表的最大下标 end ( llen list 减去 1 )还要大,或者 start > stop , ltrim返回一个空列表,因为 ltrim已经将整个列表清空。如果 stop 下标比 end 下标还要大,Redis 将 stop 的值设置为 end 。
image-20230409180628590

使用场景

消息队列

l如下图所示,Redis的lpush + brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的争抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用;

img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值