• 7.Redis-list



    redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组,而是更接近于 c++中 std::deque。列表类型是⽤来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储2^32 - 1 个元素。

    list常用命令

    lpush

    作用:将⼀个或者多个元素头插到list中。
    语法:
    LPUSH key element [element ...]
    返回值:插⼊后 list 的⻓度。
    在这里插入图片描述

    lrange

    作用:获取从 start 到 end 区间的所有元素,左闭右闭。
    语法:
    LRANGE key start stop
    在这里插入图片描述

    lpushx

    其中x -> exists的意思。
    作用:在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回
    语法:
    LPUSHX key element [element ...]
    在这里插入图片描述

    rpush

    作用:将⼀个或者多个元素尾插到 list 中。当key不存在时会创建这个key再插入
    语法:
    RPUSH key element [element ...]
    在这里插入图片描述

    rpushx

    作用:当 key 存在时,将⼀个或者多个元素尾插 到 list 中。
    语法:
    RPUSHX key element [element ...]
    在这里插入图片描述

    lpop / rpop

    lpop:头删。rpop:尾删
    语法:lpop/rpop key [count]
    在当前的 redis 5 版本中,都是没有count参数的,从 redis 6.2版本,新增了一个count 参数,表示的是要删除几个元素~~
    在这里插入图片描述

    lindex

    作用:根据下标找到list中对应下标的元素
    语法:
    LINDEX key index
    在这里插入图片描述
    返回值:取出的元素或者 nil
    时间复杂度:O(N)

    linsert

    作用:在特定位置插⼊元素,其中 pivot 不是下标,是基准值
    语法:
    LINSERT key pivot element
    在这里插入图片描述
    当基准值不存在时,则插入失败
    在这里插入图片描述

    llen

    作用:获取 list ⻓度
    语法:
    llen key
    在这里插入图片描述

    lrem

    其中rem 是 remove 的缩写
    语法:
    lrem key count element

    • count 表示的是要删除的个数
    • element 表示要删除的值
    • count > 0:删除从头到尾相等的count个元素。
    • count<0:删除从尾到头部coutn个相等的元素。
    • count = 0:删除与元素相等的所有元素。

    count > 0示例如下:
    在这里插入图片描述
    count < 0 示例如下:
    在这里插入图片描述
    count = 0 示例如下:
    在这里插入图片描述

    ltrim

    作用:保留 start 和 stop 之间区间内的元素。(区间外面两边的元素就直接被删除了)
    语法:
    ltrim key start stop
    在这里插入图片描述

    lset

    作用:根据下标修改元素
    语法:
    lset key index element
    在这里插入图片描述
    时间复杂度:O(n)

    阻塞版本命令

    blpop/brpop

    blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了:

    • 在列表中有元素的情况下,阻塞和非阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
    • 命令中如果设置了多个键,那么会从左向右进⾏遍历 key,⼀旦有⼀个 key 对应的列表中可以弹出元素,命令立即返回。
    • 如果多个客户端同时对⼀个键执行 pop,则最先执⾏命令的客户端会得到弹出的元素。

    作用:用途主要就是用来作为“消息队列”
    语法:
    BLPOP/BRPOP key [key ...] timeout
    在redis 5当中,timeout 时间只能是整数,但在redis 6及之后timeout时间允许设定成小数,timeout单位是秒。

    当列表不为空时,lpop与blpop没有区别
    在这里插入图片描述
    当列表为空时且后续timeout时间内没有元素插入,lpop与blpop区别如下
    在这里插入图片描述

    当列表为空时且后续timeout时间内有元素插入,lpop与blpop区别如下
    在这里插入图片描述

    1. 针对一个非空列表操作,有元素时立即返回弹出的元素与lpop一致
      在这里插入图片描述
    2. 针对一个空列表进行操作,当在timeout时间内有新元素插入
      在这里插入图片描述
      3.针对多个 key 进行操作
      在这里插入图片描述

    总结

    ps:本来是想弄成表格的,但是不会 markdown 这种将某几行的某一列合并成一个单元格这种语法,然后只能以图片的方式展现了,希望有会的人再评论区教教我,thanks~
    在这里插入图片描述

    内部编码

    在之前的版本中 list 的内部编码为以下两种

    • ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤iplist 来作为列表的内部编码实现来减少内存消耗。
    • linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现

    在redis 3.2之后,redis内部编码只是 quicklist 一种。

    • quicklist 相当于是 链表 和压缩列表的结合,整体还是一个链表,链表的每个节点是一个压缩列表。
      在这里插入图片描述

    应用场景

    使用redis作为消息队列

    Redis 可以使⽤ lpush + brpop 命令组合实现经典的阻塞式⽣产者-消费者模型队列,⽣产者客户端使⽤ lpush 从列表左侧插⼊元素,多个消费者客户端使⽤ brpop 命令阻塞式地从队列中 “争抢” 队⾸元素。通过多个客户端来保证消费的负载均衡和高可用性。
    在这里插入图片描述
    选择列表类型时,请参考:
    同侧存取(lpush + lpop 或者 rpush + rpop)为栈
    异侧存取(lpush + rpop 或者 rpush + lpop)为队列

  • 相关阅读:
    网格搜索和交叉验证
    重温文件操作(一)
    mysql-binlog
    Part2_扩展MATSIM_Subpart4_除个人车外的其他模式_第16章 用Matsim建模公共交通
    【第6篇】AI语音测试简介
    【D3.js】1.13-动态设置每个 Bar 的坐标
    TypeScript_面向对象
    硬盘那些事(硬盘的分类)
    DolphinDB 四大因子库合集
    Mybatis——Mybatis入门项目从创建到完成的完整过程【单表的增删改查】
  • 原文地址:https://blog.csdn.net/weixin_47812603/article/details/132586384