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类型如何实现最新列表。
好啦,本期到这里了,下期见~
相关文章:
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、阻塞相关命令:…...
react拖拽依赖库react-dnd
注:对于表格自定义行可以拖拽和树自定义节点可以拖拽等比较适用,其余的拖拽处理可以使用dragstart,drop等js原生事件来实现 react-dnd使用方法很简单,直接上干货 第一步安装依赖并引入 import { DndProvider } from react-dnd;…...
win10环境安装使用docker-maxwell
目的:maxwell可以监控mysql数据变化,并同步到kafka、mq或tcp等。 maxwell和canal区别: maxwell更轻量,canal把表结构也输出了 docker bootstrap可导出历史数据,canal不能 环境 :win10,mysql5…...
Docker部署RabbitMQ
Docker部署RabbitMQ 介绍 RabbitMQ是一个开源的消息队列系统,它被设计用于在应用程序之间传递消息。它采用了AMQP(高级消息队列协议)作为底层通信协议,这使得它能够在不同的应用程序之间进行可靠的消息传递。 那么,…...
23个react常见问题
1、setState 是异步还是同步? 合成事件中是异步 钩子函数中的是异步 原生事件中是同步 setTimeout中是同步 相关链接:你真的理解setState吗?: 2、聊聊 react16.4 的生命周期 图片 相关连接:React 生命周期 我对 Reac…...
【python基础】——Anaconda下包更新的坑及安装与卸载、及安装后Jupyter Notebook没反应的解决方法
文章目录 前言一、起因:如何一步步走到卸载重装anaconda?二、卸载anaconda二、重新安装anaconda三、关于安装Anaconda后,打开Jupyter Notebook运行代码没反应且in[ ]没有*前言 本文主要用来记录自己近期踩坑的一些复盘。其中坑有: ‘.supxlabel’ 不起作用的解决pip list 与…...
CSS 中的 display 和 visibility
CSS 中的 display 和 visibility 都可以设置一个元素在浏览器中的显示或隐藏效果。 display: 隐藏某个元素时,不会占用任何空间。换句话讲,不会影响布局。visibility: 隐藏某个元素时,仍需占用与未隐藏之前一样的空间。换句话讲,…...
解决mysql报错this is incompatible with DISTINCT
环境 centos 9 php7.4 mysql5.7 问题 mysql查询报如下错误: SQLSTATE[HY000]: General error: 3065 Expression #1 of ORDER BY clause is not in SELECT list, references column hst_csc.q.timestamp which is not in SELECT list; this is incompatible with…...
C++-map和set
本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器,比如: vector 、 list 、 deque 、forward_list(C11)等,这些容器统称为序列式…...
微信小程序AI类目-深度合成-AI问答/AI绘画 互联网信息服务算法备案审核通过教程
近期小程序审核规则变化后,很多使用人类小徐提供的chatGPT系统的会员上传小程序无法通过审核,一直提示需要增加深度合成-AI问答、深度合成-AI绘画类目,该类目需要提供互联网信息服务算法备案并上传资质,一般对企业来说这种务很难实…...
蓝桥杯官网练习题(星期一)
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 整个 2020 世纪(1901 年 1 月 1 日至 2000 年 12 月 3131 日之间),一共有多少个星期一?(不要告诉我你不知道今天是星…...
centos7更新podman
实验环境:centos7.7.1908 1.安装podman并查看版本 yum install podman podman -v 当前podman版本信息是1.6.4 2.更新podman版本 通过查看资料显示centos 7 支持最高版本为 3.4.4,更新podman大致有以下四步: golang 安装(本次使用版本: 1.…...
Java特性之设计模式【抽象工厂模式】
一、抽象工厂模式 概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式 在抽象工厂模式中,接口是…...
机器学习简介
引言 为何现在机器学习如此热门? 主要原因是由于“人类无论如何也做不到在短时间内实现从大量的数据中自动的计算出正确的结果操作”。 什么是机器学习? 所谓的机器学习,就是通过对数据进行反复的学习,来找出其中潜藏的规律和模式…...
linux之perf(2)list事件
Linux之perf(2)list事件 Author:Onceday Date:2023年9月3日 漫漫长路,才刚刚开始… 参考文档: Tutorial - Perf Wiki (kernel.org)perf-list(1) - Linux manual page (man7.org) 1. 概述 perf list用于列出可用的性能事件,这…...
将多个EXCEL 合并一个EXCEL多个sheet
合并老版本xls using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using NPOI.HSSF.UserModel; …...
【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
微信小程序——数据绑定
在微信小程序中,可以通过以下代码实现数据绑定: 在WXML中,使用双大括号{{}}绑定数据,将数据渲染到对应的视图中。 <view>{{message}}</view>在JS中,定义一个数据对象,并将其绑定到页面的data…...
libbpf-bootstrap安卓aarch64适配交叉编译
1.为什么移植 疑惑 起初我也认为,像libbpf-bootstrap这样在ebpf程序开发中很常用的框架,理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码,各个内核上的ebpf虚拟机大同小异…...
【剑指Offer】24.反转链表
题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制: 0 < 节点个数 < 5000 解答 源代码 /*** Defin…...
RAG 系统优化全流程:从数据入库到召回排序
RAG(Retrieval-Augmented Generation)系统的检索质量直接决定生成内容的上限。本文从工程落地角度,系统梳理 RAG 检索链路的三个核心阶段——入库、查询与召回。针对每个阶段的关键技术(语义分割、问答模拟、查询改写、语义校验、混合检索、语义重排)给出定义、问题背景、…...
ARM GICv3虚拟中断处理:GICV_IAR寄存器详解
1. GICV_IAR寄存器概述GICV_IAR(Virtual Machine Interrupt Acknowledge Register)是ARM GICv3架构中虚拟CPU接口的关键寄存器,主要用于虚拟机环境下的中断确认机制。当虚拟中断信号到达处理器时,通过读取该寄存器可以获取当前最高…...
编写程序统计行业招聘薪资行情数据,智能比对企业薪资标准,优化薪资体系,减少企业人才流失问题。
一、实际应用场景描述在中型及以上企业的人力资源管理中,经常出现:- 企业需制定或调整岗位薪资标准(Salary Band)- 市场上同岗位薪资随城市、行业、经验年限波动明显- 企业内部薪资数据分散在 HR 系统 / Excel 中,缺乏…...
技术乐观主义与悲观主义:我们正在走向乌托邦还是dystopia?
测试者的双重身份作为一名软件测试从业者,我们天然地同时拥有两副眼镜:一副是信任的眼镜,相信系统能够按照预期运行,相信缺陷终将被发现和修复;另一副是怀疑的眼镜,习惯于在任何看似完美的流程中寻找裂缝&a…...
基于硬件虚拟化的AI智能体安全隔离方案Clawcage设计与实现
1. 项目概述:为AI智能体打造一个坚不可摧的“笼子”如果你最近在尝试运行一些本地的AI智能体,比如Claude Desktop、Cursor的Agent模式,或者各种开源的AI助手工具,心里可能总会有点打鼓。这些工具功能强大,但它们背后运…...
成都企业AI本地化部署之后:如何让大模型和企业智能体持续产生价值?
一、成都 AI 进入新阶段:从“部署模型”转向“运营能力”过去一年,成都人工智能产业热度持续上升。公开报道显示,成都正在围绕人工智能产业生态、智能体应用、智能制造和数字化转型加快布局,本地企业对大模型、私有化部署和产业场…...
Shell脚本工程化:great.sh框架解决运维脚本可维护性难题
1. 项目概述:一个被低估的Shell脚本构建框架如果你和我一样,常年混迹在运维、DevOps或者后端开发领域,那么对Shell脚本的感情一定是复杂的。一方面,它是我们最趁手的“瑞士军刀”,从服务器初始化、日志分析到自动化部署…...
传统RAG把文档切碎,TreeSearch不接受,结果反而更快更准
无需 Embedding,无需向量库,无需切分——开源项目TreeSearch 用树结构保留文档灵魂,毫秒级检索万级文档。 你是不是也被 RAG 切碎过? 用过 RAG 的人都知道这个痛点: 文档被机械地切成固定大小的 chunk,喂…...
霍尔效应绝对式双码道磁编码器【附电路】
✨ 长期致力于双码道多磁极编码器、硬件设计、误差仿真与校正、算法设计与优化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)双码道多磁极磁场检测硬…...
利用ODX实现整车诊断数据库管理
一:背景与挑战| 背景:在全球汽车行业快速发展的背景下,对车辆诊断技术的要求也在不断提升。ODX(Open Diagnostic data eXchange)作为行业标准的诊断数据库,已被各大汽车制造商广泛采用,并贯穿于ECU的整个生…...
