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类型如何实现最新列表。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium环境搭建

一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java… 2.jdk 1)下载地址 官网(需登录账号): https://www.oracle.com/java/technologies/downloads/ 百度网盘&…

Qt应用开发(基础篇)——向导对话框 QWizard

一、前言 QWizard类继承于QDialog,为有向导界面需求的应用环境提供了一个框架。 对话框窗口 QDialog QWizard向导对话框是一个拥有队列界面的特殊对话框,向导的目的是引导用户一步一步的完成预设的流程。向导常用于软件安装界面向导、硬件线路安装向导、…

界面控件DevExpress WPF(v23.2)下半年发展路线图

本文主要概述了DevExpress官方在下半年(v23.2)中一些与DevExpress WPF相关的开发计划。 通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress …

一起学数据结构(5)——栈和队列

1. 栈的相关定义及特点: 1. 栈的相关定义: 在正式介绍栈的定义之前,首先来回顾一下关于线性表的定义: 线性表是具有相同数据类型的个数据元素的有限序列,其中为表长。当时,可以把线性表看作一个空表&…

SwiftUI 内功加持:“曳光弹“实现自定义样式进度条(ProgressView)

概览 虽然 SwiftUI 已为我们内置了很多常用视图,不过有时我们还是需要根据实际来进一步美化显示或增加功能。 如上图所示,在本篇博文中我们将结合敏捷哲学中一个超级实用的开发技巧:曳光弹,来一步一个脚印循序渐进的实现 Progres…

redisson分布式锁

RLock官网解释 基于Redis的Java分布式可重入锁对象,实现了锁接口。 如果获得锁的Redisson实例崩溃,那么这种锁可能永远挂起在获得状态。为了避免这种情况,Redisson维护了锁看门狗,它在锁持有者Redisson实例活着的时候延长锁过期时…

逻辑回归(Logistic Regression)

1.分类问题 在分类问题中,你要预测的变量 y是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例…

MultipartFile是什么

Multipart是一种file的类型 在我们进行文件上传时所发出的请求,我们页面对请求格式有明确的要求: 1.post提交表单方式 2.编码格式enctype必须是muitipart/form-data,这种格式适合传输数据量大的二进制数据文件 3.类型必须是file类 流程举例&#xf…

软件测试报告有什么用?

报告类型 不同的报告类型有不同的报告用途,以下分类别进行分析 1、登记测试报告 可以用于软件产品的增值税即征即退、软件企业的双软评估以及计算机系统集成资质的材料 2、鉴定\确认测试报告 可以用用于政府项目申报、高新认证、项目结题、创新产品认定、各类政…

Excel怎么批量生成文件夹

Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

C 风格文件输入/输出---直接输入/输出---(std::fread)---(std::fwrite)

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 从直接输入/输出 文件读取 std::fread 从给定输入流 stream …

MMDetection实验记录踩坑记录

AP值始终为0 在实验MMDetection的DAB-DETR模型进行实验时&#xff0c;AP值始终上不去。 可以看到&#xff0c;在第22个epoch时的AP值仅为0.002 因为在此之前已经运行过YOLOX,Faster-RCNN等模型&#xff0c;所以数据集的设置肯定是没有问题的&#xff0c;而博主也只是修改了DAB…

Qt包含文件不存在问题解决 QNetworkAccessManager

这里用到了Qt的网络模块&#xff0c;在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到&#xff0c;可以通过在项目上右键执行qmake后&#xff0c;直接#include <QNetworkAccessManager>就不会报错了&#xff1a;

java获取jenkins发布版本信息

一.需求&#xff1a; 系统cicd发布时首页需要展示jenkins发布的版本和优化内容 二.思路: 1.jenkins创建用户和秘钥 2.找到对应构建任务信息的api 3.RestTemplate发起http请求 三.实现&#xff1a; 1.创建用户和token 2.查找jenkins API 创建 Job POST http://localhost…

Flask狼书笔记 | 06_电子邮件

文章目录 6 电子邮件6.1 使用Flask-Mail发送6.2 使用事务邮件服务SendGrid6.3 电子邮件进阶6.4 小结 6 电子邮件 Web中&#xff0c;我们常在用户注册账户时发送确认邮件&#xff0c;或是推送信息。邮件必要的字段包含发信方(sender)&#xff0c;收信方(to)&#xff0c;邮件主题…

【vue2第十四章】 插槽(普通插槽、具名插槽、作用域插槽语法)

插槽 插槽是什么&#xff1f; 在 Vue 2 中&#xff0c;插槽&#xff08;slot&#xff09;是一种用于定义组件内部内容分发的机制。它允许你将组件中的一部分内容替换为用户自定义的内容&#xff0c;并在组件内部进行渲染。 通过在组件模板中使用 <slot></slot> 标…

常见IO模型(非常详细)

背景知识 常⽤5中⽹络IO模型 阻塞IO&#xff08;Blocking IO&#xff09;⾮阻塞IO&#xff08;Non-Blocking IO&#xff09;多路复⽤IO&#xff08;IO Multiplexing&#xff09;信号驱动IO&#xff08;Signal Driven IO&#xff09;异步IO&#xff08;Asynchronous IO&#x…

纯css实现奥运五环、3D平移、旋转、扭曲

文章目录 前言效果图htmlcss 前言 1、不是真正的五环&#xff0c;因为通过形变得来。 2、不同电脑显示器的像素不同&#xff0c;显现的效果不同。 3、不推荐使用此方法。 4、主要通过旋转加平移的方式实现。 效果图 html <div class"olympic_rings"><span …

我眼中的《视觉测量技术基础》

为什么会写这篇博客&#xff1a; 首先给大家说几点&#xff1a;看我的自我介绍对于学习这本书没有任何帮助&#xff0c;如果你是为了急切的想找一个视觉测量的解决方案那可以跳过自我介绍往下看或者换一篇博客看看&#xff0c;如果你是刚入门想学习计算机视觉的同学&#xff0…

【HTML/CSS】入门导学篇

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;如果有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 本文内容出自B站pink老师的前端入门教程&#xff0c;感谢pink老师&#xff01;&#xff01;&#xff01; 视频链…