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

news2024/11/24 22:42:49

目录

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.coloradmin.cn/o/993798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

deepin V23通过flathub安装steam畅玩游戏

deepin V23缺少32位库,在星火商店安装的steam,打开报错,无法使用! 通过flathub网站安装steam,可以正常使用,详细教程如下: flathub网址:主页 | Flathub 注意:flathub下载速度慢,只…

【笔试强训选择题】Day38.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!! 文章目录 前言一、Day…

ChatGPT实战与私有化大模型落地

文章目录 大模型现状baseline底座选择数据构造迁移方法评价思考 领域大模型训练技巧Tokenizer分布式深度学习数据并行管道并行向量并行分布式框架——Megatron-LM分布式深度学习框架——Colossal-AI分布式深度学习框架——DeepSpeedP-tuning 微调 资源消耗模型推理加速模型推理…

基于SSM的学院实验中心管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

从数据页的角度看 B+Tree

InnoDB 是如何存储数据的? MySQL支持多种存储引擎,不同的存储引擎,存储数据的方式也不相同,我们最常使用的是 InnoDB 存储引擎。 在数据库中的记录是按照行来存储的,但是数据库的读取并不是按照 [ 行] 为单位&#x…

MySQL进阶 —— 超详细操作演示!!!(上)

MySQL进阶 —— 超详细操作演示!!!(上) 一、存储引擎1.1 MySQL 体系结构1.2 存储引擎介绍1.3 存储引擎特点1.4 存储引擎选择 二、索引2.1 索引概述2.2 索引结构2.3 索引分类2.4 索引语法2.5 SQL 性能分析2.6 索引使用2…

BUUCTF rip 1

使用linux的file命令查看基本信息 64位 使用IDA64位进行反编译 看到gets就肯定有栈溢出 能看到有一个 _system函数,改函数能执行系统命令 既然反编译有这个函数说明有地方调用了他 果然在一个fun函数中有调用,执行的命令是 /bin/sh 也就是一个后门函数&…

【C++ • STL • 力扣】详解string相关OJ

文章目录 1、仅仅翻转字母2、字符串中的第一个唯一字符3、字符串里最后一个单词的长度4、验证一个字符串是否是回文5、字符串相加总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ" 1、仅仅翻转字母 力扣链接 代码1展示&…

【Spring Cloud系列】 雪花算法原理及实现

【Spring Cloud系列】 雪花算法原理及实现 文章目录 【Spring Cloud系列】 雪花算法原理及实现一、概述二、生成ID规则部分硬性要求三、ID号生成系统可用性要求四、解决分布式ID通用方案4.1 UUID4.2 数据库自增主键4.3 基于Redis生成全局id策略 五、SnowFlake(雪花算…

数据结构与算法-----顺序表(链表篇)

目录 前言 顺序表 链表 概念 与数组的不同 单链表 1. 创建节点 2.插入节点 尾插节点(形成链表结构) 向指定位置插入节点(链表已有) ​编辑 3.遍历链表数据 4.获取链表长度 5.删除节点 删除尾节点 删除指定节点 …

51单片机项目(10)——基于51单片机的电压计

本次设计的电压计,使用ADC0832芯片,测到电压后,将电压信息发送到串口进行显示。仿真功能正常,能够运行。(工程文件和代码放在最后) 电路图如下: 运行过程如下: ADC0832介绍&#xff…

linux下检测CPU性能的mpstat命令安装与用法

1、安装命令 $ sudo apt-get install sysstat sysstat安装包还包括了检测设备其它状态的命令&#xff0c;查看命令如下&#xff1a; 2、检测CPU命令语法 $ mpstat --h //查看mpstat的语法 Usage: mpstat [ options ] [ <interval> [ <count> ] ] Options are: …

设计模式之访问器模式(Visitor)的C++实现

1、访问器模式的提出 在软件开发过程中&#xff0c;早已发布的软件版本&#xff0c;由于需求的变化&#xff0c;需要给某个类层次结构增加新的方法。如果在该基类和子类中都添加新的行为方法&#xff0c;将给代码原有的结构带来破坏&#xff0c;同时&#xff0c;也违反了修改封…

D. Sorting By Multiplication

Problem - D - Codeforces 思路&#xff1a;我们首先考虑当只能乘以正数时&#xff0c;那么变为单调增的方法就是找所有w[i]>w[i1]的对数&#xff0c;因为如果存在一个w[i]>w[i1]&#xff0c;那么我们一定至少需要进行一次操作&#xff0c;并且我们还知道我们进行一次操…

Redis经典问题:缓存穿透

&#xff08;笔记总结自《黑马点评》项目&#xff09; 一、产生原因 用户请求的数据在缓存中和数据库中都不存在&#xff0c;不断发起这样的请求&#xff0c;给数据库带来巨大压力。 常见的解决方式有缓存空对象和布隆过滤器。 二、缓存空对象 思路&#xff1a;当我们客户…

JP《乡村振兴振兴战略下传统村落文化旅游设计》许少辉书香续,山水长

JP《乡村振兴振兴战略下传统村落文化旅游设计》许少辉书香续&#xff0c;山水长

MySQL--MySQL表的增删改查(基础)

排序&#xff1a;ORDER BY 语法&#xff1a; – ASC 为升序&#xff08;从小到大&#xff09; – DESC 为降序&#xff08;从大到小&#xff09; – 默认为 ASC SELECT … FROM table_name [WHERE …] ORDER BY column [ASC|DESC], […]; *** update

【数据结构--顺序表】合并两个有序数组

题目描述&#xff1a; 代码实现&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int x0;if(m0)//如果nums1为空&#xff0c;而nums2不为空&#xff0c;则将nums2拷贝至nums1{while(nums1Size--){nums1[x]nums2[x];x;}}if(n0)//…

深入学习 GC 算法 - 标记清除算法

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

【蓝凌表单】如何限制明细表字段1与字段2一致时不允许提交

无需开发&#xff0c;表单内置功能快速解决&#xff1b; 有些搞笑&#xff0c;维护蓝凌系统好几年&#xff0c;对系统好多功能也不是很熟悉&#xff0c; 当接到业务需求&#xff0c;不允许某信息跟某信息一致的需求时&#xff0c;第一时间是想到用JS脚本去实现&#xff0c;忽略…