• Redis-带你深入学习数据类型list


    目录

    1、list列表

    2、list相关命令

    2.1、添加相关命令:rpush、lpush、linsert

    2.2、查找相关命令:lrange、lindex、llen

    2.3、删除相关命令:lpop、rpop、lrem、ltrim

    2.4、修改相关命令:lset

    2.5、阻塞相关命令:blpop、brpop

    3、应用场景

    3.1、消息队列

     3.2、最新列表


    1、list列表

            redis中list并非是一个简单的数组,而更像是一个双端队列,具体的结合下面的命令你会更加容易理解~

     list的特点:

    • list中元素是有序的----存放有序
    • 列表中元素可以重复
    • 列表头部尾部都可以进行插入或删除元素

    2、list相关命令

    下述所有命令涉及到的头部都可理解为列表左侧,列表末尾都可理解为列表右侧 

    2.1、添加相关命令:rpush、lpush、linsert

    rpush:

    • rpush:在列表尾部添加元素;若key不存在则新增key,然后再添加相应元素;若存在则在末尾追加
    • 语法:rpush key value [value...]
    • 返回值:添加后的元素数量
    • 时间复杂度O(1)---O(k)

    举例:

    lpush:

    举例:

    查看是否正确:

    • lpush:在列表头部添加元素;若key不存在则新增key,然后再添加相应元素;若存在则在头部添加
    • 语法:lpush key value [value...]
    • 返回值:添加后的元素数量
    • 时间复杂度O(1)---O(k)

    linsert:

    •  linsert:在特定元素前或后添加元素
    • 语法:linsert key before | after pivot value
    • 返回值:添加后元素个数
    • 时间复杂度O(n)--n为头部到pivot的距离

    举例:

    2.2、查找相关命令:lrange、lindex、llen

    lrange:

    •  lrange:在特点元素前或后添加元素
    • 语法:lrange key start stop
    • 返回值:返回指定区间的元素
    • 时间复杂度O(n)--n为头部到start的距离加上stop的范围

    举例:

    注:

    • 下标可为负数 
    • 若下标不合法,则会尽可能的返回可以获取到的值

    lindex:

    • lindex:给定下标,获取相应元素
    • 语法:lindex key index
    • 返回值:相应的值;无则返回nil
    • 时间复杂度O(n)---n值索引的偏移量

    举例:

    llen:

    • llen:获取列表的长度
    • 语法:llen key
    • 返回值:列表的长度
    • 时间复杂度(1)

    举例:

    2.3、删除相关命令:lpop、rpop、lrem、ltrim

    lpop:

    • lpop:删除列表头部的第一个元素
    • 语法:lpop key
    • 返回值:删除的元素的值
    • 时间复杂度(1)

    举例:

    rpop:

    • rpop:删除列表的末尾的第一个元素
    • 语法:rpop key
    • 返回值:被删除的元素的值
    • 时间复杂度(1)

    举例:

    注:lpop和rpop在redis6之后就增加参数了,可以指定删除前几个或后几个,例rpop key count 

    lrem:

    • lrem:删除指定的元素,且可指定具体删除几个
    • 语法:lrem key count value
    • 返回值:被删的元素的个数
    • 时间复杂度(k)----k为元素数
    • 补充:count大于0时从头部开始往后删,小于0时从末尾往前删,等于0时删除全部

    举例:

    ltrim:

    • ltrim:保留指定区间的值,其余的全删除
    • 语法:ltrim key start stop
    • 返回值:命令执行成功返回ok
    • 时间复杂度(k)---k元素个数
    • 补充:start 和 stop是闭区间

    举例:

    2.4、修改相关命令:lset

    • lset:根据指定下标修改元素值
    • 语法:lset key index value
    • 返回值:执行成功返回ok;下标越界会弹出相应提示,如下举例
    • 时间复杂度O(n)

    举例:

    2.5、阻塞相关命令:blpop、brpop

    blpop:

    • blpop:lpop的阻塞版本
    • 语法:blpop key [key...] timeout
    • 返回值:返回值有两个以列表形式,第一个是删除的是那个key的首部元素,第二个是删除的元素的值~
    • 时间复杂度O(1)
    • 补充:timeout为该阻塞最长为多长时间,单位:s;在改命令阻塞时,redis依然可以处理其他命令

    举例:

    上述由于key中有值,所以无需等待,立即可删除

    上述由于超出时间后,依然没有值可进行删除

    操作一:

    操作二:

     

    上述在阻塞期间,有值可删时立即删除,命令执行完成~ 

    brpop:

    • brpop:rpop的阻塞版本
    • 语法:brpop key [key...] timeout
    • 返回值:返回值有两个以列表形式,第一个是删除的是那个key的首部元素,第二个是删除的元素的值~
    • 时间复杂度O(1)
    • 补充:同上命令blpop 


    3、应用场景

    3.1、消息队列

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

     3.2、最新列表

            list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

            但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现。对于需要分页并且会频繁更新的列表,需用使用有序集合sorted set类型实现。另外,需要通过时间范围查找的最新列表,list类型也实现不了,也需要通过有序集合sorted set类型实现,如以成交时间范围作为条件来查询的订单列表。之后在介绍有序集合sorted set类型的应用场景时会详细介绍sorted set类型如何实现最新列表。

    好啦,本期到这里了,下期见~

  • 相关阅读:
    SpringBoot + Apache tika 轻松实现各种文档内容解析
    面试题五:computed的使用
    Promise对象和async/await
    zabbix监控实战
    【软考】系统集成项目管理工程师(九)项目成本管理【4分】
    软件‘小程序‘前台开发软件定制的知识|app网站搭建
    全连接神经网络结构图,神经网络示意图怎么画
    基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真
    Linux mmap原理
    简单明了,数据库设计三大范式
  • 原文地址:https://blog.csdn.net/LYJbao/article/details/132779944