• 【Redis】redis5种数据类型(list)


    目录

    基本介绍

    命令

    LPUSH

    LPUSHX

    RPUSH

    RPUSHX

    LRANGE

    LPOP

    RPOP

    LINDEX

    LINSERT

    LLEN

    LREM

    LTRIM

    LSET

    阻塞版本的命令

    BLPOP

    内部编码


    基本介绍

    list相当于c++的双端队列deque

    区分获取和删除的区别

    1. lindex能获取到元素的值
    2. lrem也能返回被删除元素的值 

    命令

    LPUSH

    将一个或者多个元素从左侧放入(头插)到list中

    语法:

    LPUSH key element [element...]

    时间复杂度:O(k),k是元素个数

    返回值:插入后list的长度 。

    如果key已经存在,并且key对应的value类型,不是list,此时lpush命令就要报错

    LPUSHX

    在key存在时,将一个或者多个元素从左侧放入(头插)到list 中,不存在,则返回

    语法:

    LPUSHX key element [element...]

    时间复杂度:O(1)

    返回值:插入后list的长度 。

    RPUSH

    将一个或者多个元素从右侧放入(尾插)到list中

    语法:

    RPUSH key element [element...]

    时间复杂度:O(k),k是元素个数

    返回值:插入后list的长度

    RPUSHX

    在key存在时,将一个或者多个元素从右侧侧放入(尾插)到list 中,不存在,则返回

    语法:

    RPUSHX key element [element...]

    时间复杂度:O(1)

    返回值:插入后list的长度 。

    LRANGE

    查看list中指定范围的元素

    语法:

    LRANGE key start stop //此处的区间是闭区间

    时间复杂度:O(s+n),s是start的偏移量,n是start到stop

    返回值:指定区间元素

    LPOP

    从list左侧取出元素(即头删)

    语法:

     LPOP key

    时间复杂度:O(1)

    返回值:取出的元素或者nil

    RPOP

    从list右侧取出元素(即尾删)

    语法:

    RPOP key

    时间复杂度:O(1)

    返回值:取出的元素或者nil

    LINDEX

    获取从左数第index位置的元素

    语法:

    LINDEX key index

    时间复杂度:O(N),N是索引的偏移量

    返回值:取出的元素或者nil(下标非法返回nil)

    LINSERT

    在特定位置插入元素

    语法:

     LINSERT key pivot element

    • 插入指定位置之前还是之后
    • pivot 插入位置的基准值
    • element 插入的值
    • linsert进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的即可

    时间复杂度:O(N),N是pivot距离头尾的距离

    返回值:插入后list的长度

    LLEN

    获取list长度

    语法:

    LLEN key

    时间复杂度:O(1)

    返回值:list的长度,不存在的key返回0

    LREM

    语法:

    LREM key count element

    • count 要删除的个数
    • element 要删除的值
    • count是正数从左开始找,负数是从右开始找,0代表符合删除的值的全删除

    时间复杂度:O(N+M),N列表长度,M删除元素个数

    返回值:删除的个数

    LTRIM

    语法:

    LTRIM key start stop

    • 保留start和stop之间区间内的元素(区间外面两边的元素就直接被删除了)

    LSET

    根据下标修改元素

    语法:

    LSET key index element

    • index越界报错

    时间复杂度:O(N),N索引的偏移量

    阻塞版本的命令

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

    • 在列表有元素的情况下,阻塞和非阻塞的表现是一致的,但如果列表中没有元素,非阻塞版本会立即返回nil;但阻塞版本会根据timeout,阻塞一段时间,期间redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
    • 使用brpop和blpop的时候,这里是可以显式设置阻塞时间的。
    • blpop和brpop都是可以同时去获取多个key的列表的元素的,多个key对应多个list,这多个list哪个有元素了,就返回哪个元素。
    • 如果多个客户端同时对一个键执行pop,先执行命令的客户端会得到弹出的元素。

    brpop的用法与效果与blpop类似,这里只介绍blpop

    BLPOP

    LPOP的阻塞版本

    语法:

    BLPOP key [key ...] timeout

    • timeout单位是秒

    时间复杂度:O(1)。

    返回值:当针对一个非空的列表进行操作,返回的结果相当于一个pair,一方面告诉我们当前的数据来自哪个key,另一方面告诉我们取到的数据是啥。若列表为空等待timeout秒,若超过timeout的时间,则返回nil。

    内部编码

    列表类型的内部编码有两种: 

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

    上面两种编码方式是旧版本的实现方式,现在一般使用quikelist,quikelist相当于链表和压缩列表的结合,整体还是一个链表,链表的每个元素是压缩列表,每个压缩列表都不让它太大(通过list-max-ziplist-size来配置)

  • 相关阅读:
    【无线电力传输】12 V 直流风扇无线电力传输系统的实现(Simulink)
    流体力学基础——简介
    修改git历史合入记录的方法
    2021 中国系统java面试笔试题(含面试题解析)
    学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义
    HTTP基础知识
    SpringBoot中日志的使用log4j
    LeetCode Hot100 LRU缓存
    代码随想录算法训练营第58天 | 392.判断子序列 , 115.不同的子序列
    java计算机毕业设计H5醉美南湾湖网站设计MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/lzb_kkk/article/details/141923246