Redis -- list列表
只有克服了情感的波动,才能专心致志地追求事业的成功
目录
列表
list命令
lpush
lpushx
rpush
rpushx
lrange
lpop
rpop
lindex
linsert
llen
lrem
ltrim
阻塞命令
小结

列表
列表相当于 数组或者顺序表。
列表类型是用来存储多个有序的字符串,如图 2-19 所示,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储 个元
素。在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

注意,它内部的编码方式并非是一个简单的数组,而是更接近于“双端队列”。可以做到比较高效的头插头删,尾插尾删。
当然也特供了许多的获取和删除的操作:

列表类型的特点:
- 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,
例如要获取上图图的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindex user:1:messages -1 就可以得到元素 e。 - 区分获取和删除的区别,例如上图 中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化的。
- 列表中的元素是允许重复的,例如上图中的列表中是包含了两个 a 元素的。但是像hash这样的结构中的field是不能重复的,如果重复hset,就会覆盖原来的field。

- 列表的元素是有序的,如果把元素的位置颠倒,顺序调换,此时得到的list就和原来的list不等价。
下面是关于list的一些命令。
list命令
下面的lpush中第一个字母其实是left,也就是left push,rpush就是right push。
lpush
将一个或者多个元素从左侧插入队列中。
语法:lpush key element [ element ..... ]
- 时间复杂度O(1)或者O(N),只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数。
- 多个element之间使用空格间隔。
- 返回值:list的长度,例如插入了1,2,3这三个数字,那么返回值就是3。
- 如果key已经存在,并且key对应的value类型,不是list,此时lpush就会报错。
示例:

lpushx
在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回,他类似于setnx。
语法:LPUSHX key element [element ...]
- 时间复杂度:只插入一个元素为 O(1), 插入多个元素为 O(N), N 为插入元素个数.
- 返回值:插入后 list 的长度。
- 多个elem之间使用空格间隔
示例:

注意,这里的lpushx的key一定是已经存在的key,如果key不存在返回0。
rpush
类似于lpush,只不过rpush是从最右侧插入,相当于尾插
rpushx
在 key 存在时,将一个或者多个元素从右侧放入(尾插)到 list 中
上面两个命令的用法和lpush与lpushx完全一致,这里不做过多的解释。
除了设置list,我总得能查看里面的数据吧?别急当然有法子!
lrange
获取从 start 到 end 区间的所有元素,左闭右闭。
语法:LRANGE key start stop
- 时间复杂度:O(N)
- 返回值:指定区间的元素。
示例:
首先创建一个list:


根据我们在前言列表中提到的下标进行实验:

获取除了“1”之外的值:

最简便的获取所有元素的方法,那就是0 -> -1:

因为-1代表最后一个元素。
lpop
从list左侧取出数据,这个操作会直接降价左侧的第一个数据删除并作为返回值返回
语法:lpop key
- 时间复杂度:O(1)
- 返回值为取出的元素或者nil。
示例:

rpop
从尾部删除,然后返回被删除的数据。
语法:同lpop
示例:
同lpop
lindex
获取从左数第index位置的元素。此处的lindex中的l可以理解为list index,而不是left
语法:lindex key index
- 时间复杂度:O(N),n是指的list中的元素个数。
- 返回值:对应下标的元素。下标非法则返回nil
示例:

将这个list,使用lindex,获取其值。

linsert
在特定位置插入元素。你可以选择从左侧插入,也可以从右侧插入,你可以选择自己想要的,但是你只能选择其中一种。
语法:linsert key <before | after> pivot element
- key 是你要插入的list
- before和after表明你要插入的时候在元素的前面还是后面
- pivot表示你要插入的基准元素(并非是元素,而是真实值)
- element是你要插入的元素
- 时间复杂度为:O(N)
- 返回值:插入后的list长度。
示例:

这就出现一个问题,一个相同的元素在list中是可以同时存在多份的:

所以list的linsert的基准是通过:
linsert 进行插入的时候,要根据基准值,找到对应的位置从左往右,找到第一个符合基准值的位置即可。
llen
获取list的长度。llen中的第一个l为list,也就是list length的意思。
语法:llen key
- 时间复杂度:O(1)
- 返回值:list 的长度,也就是list中包含的元素个数。
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2
lrem
list remove,
语法:lrem key count element
- count删除的个数。
- element 是要删除的值。
- 时间复杂度:O(N + M),N是list的长度,M是删除元素的个数。
- 如果count > 0意思是从左往右数第一个element开始,从左往右依次删除count个。
- 如果count < 0意思是从右往左数第一个element开始,从右往左依次删除count个。
- 如果count = 0, 删除所有的值为element的元素。
示例:

删除右边两个1:

删除:

ltrim
保留start和stop区间的元素。区间外的元素就被删除了。
语法:ltrim key start stop
- start是开始的下标
- stop是结束的下标
- 此操作包含start和stop下标的元素,也就是说start和stop下标的元素会被保留。
- 时间复杂度O(N),N为删除的元素的个数。
示例:

lset
根据下标修改元素,可以类比lindex,lindex是根据下标获取元素,而lset则是根据下标修改元素,lset全称list set。
语法:lset key index newValue。
- 时间复杂度O(N)。
- 如果index越界的话会提示:index out of range。
示例:
设置list:1 2 3 4, 然后修改下标为0的元素的值为5:

阻塞命令
什么叫阻塞命令?阻塞: 当前的线程,不走了,代码不继续执行了。会在满足一定的条件之后,被唤醒。
关于阻塞的两个命令:
- brpop
- blpop
这个l为left的意思,b则为block的意思,意思为阻塞。咱们redis中的list就相当于一个阻塞队列,线程安全的问题,redis是靠单线程模型去提供支持的。而阻塞只支持队列为空的情况,不考虑队列满。阻塞版本会根据timeout,阻塞一段时间,期间redis可以执行其他命令,使用brpop和blpop的情况可以显示设置阻塞时间的,不一定是无休止的等待。
语法:brpop | blpop key [ key ... ] timeout
- 可以有多个key,多个key之间使用空格间隔。多个key回从左往右依次遍历。
- timeout为阻塞时间。
- 设置了timeout之后,在timeout时间段内,如果队列为空,那么此操作会阻塞等待timeout时间直到时间到达或者队列中被别的客户端插入了元素。
小结

相关文章:
Redis -- list列表
只有克服了情感的波动,才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…...
【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)
1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数,从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力,减少过拟合的风险,并且可以加快模型训练和推理速度。此外&…...
神经网络 | 基于多种神经网络模型的轴承故障检测
Hi,大家好,我是半亩花海。本文主要源自《第二届全国技能大赛智能制造工程技术项目比赛试题(样题) 模块 E 工业大数据与人工智能应用》,基于给出的已知轴承状态的振动信号样本,对数据进行分析,建…...
matplot画3D图的时候报错
使用matplot画3D图的时候,报这个错。 ERROR: Could not find a version that satisfies the requirement mpl_toolkits (from versions: none) ERROR: No matching distribution found for mpl_toolkits 要使用升级命令升级matplot而不是安装 pip install --upgr…...
如何使用LNMP让网站顺利工作?
如何使用LNMP让网站顺利工作? 1. Nginx的安装和部署 2. nginxphpmysql 3. nginx php-fpm安装配置 4. Nginx配置性能优化的方法 5. 如何使用Nginx实现限制各种恶意访问...
最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画局部编辑重绘,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图
一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…...
多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测
多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LSSVM卷积神经…...
使用NLTK进行自然语言处理:英文和中文示例
Natural Language Toolkit(NLTK)是一个强大的自然语言处理工具包,提供了许多有用的功能,可用于处理英文和中文文本数据。本文将介绍一些基本的NLTK用法,并提供代码示例,展示如何在英文和中文文本中应用这些…...
学习Spring的第十六天
AOP底层两种生成Proxy的方式 我来解释这两种方式 1 目标类有接口 , 调用JDK的动态代理实现 2 目标类没有接口 , 用Cglib实现 , 即生成目标类的子类 , 来实现动态代理 , 所以要求目标类不能时final修饰的 . (若有接口 , 也可用Cglib方式实现 , 需要手动配置<aop: config pr…...
学习笔记-01
学习笔记记录了我在学习官方文档过程中记的要点,可以参考学习。 go build *.go 文件 编译 go run *.go 执行 go mod init 生成依赖管理文件 gofmt -w *.go 格式换名称的大小写用来控制方法的可见域主方法及包命名规范 package main //注意package的命名࿰…...
opensatck中windows虚拟机CPU核数显示异常问题处理
文章目录 一、问题描述二、元数据信息三、以32核的实例模版为例3.1 单槽位32核3.2 双槽位32核 总结 一、问题描述 openstack创建windows虚拟机的时候,使用普通的实例模版会出现CPU数量和实例模版不一致的问题。需要定制元数据才可以正常显示。 帖子:htt…...
Camunda流程引擎数据库架构
💖专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧😘 💖数据库架构…...
Leetcode21:合并两个有序链表
一、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]输入:l1 [], l2 [] 输出:[]输入&#…...
深度学习驱动下的自然语言处理进展及其应用前景
文章目录 每日一句正能量前言技术进步应用场景挑战与前景自然语言处理技术当前面临的挑战未来的发展趋势和前景 伦理和社会影响实践经验后记 每日一句正能量 一个人若想拥有聪明才智,便需要不断地学习积累。 前言 自然语言处理(NLP)是一项正…...
Zookeeper相关面试准备问题
Zookeeper介绍 Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,Zookeeper就负责通知已经在Zoo…...
SpringBoot整理-性能优化
Spring Boot性能优化通常涉及到多个方面,包括代码优化、数据库交互、资源使用和系统配置等。下面是一些常见的优化建议: 代码层面的优化:使用合适的数据结构和算法。减少不必要的对象创建,避免内存泄漏。对于重复使用的对象,考虑使用对象池。数据库优化:优化SQL查询,避免复…...
数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)
数据库管理145期 2024-02-06 数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206)1 概览2 性能中心3 性能中心-Exadata总结 数据库管理-第146期 最强Oracle监控EMCC深入使用-03(20240206) 作者:胖头鱼的鱼缸&…...
QT上位机:串口调试助手
前言 上位机的简单编写可以帮我们测试并完善平台,QT作为一款跨平台的GUI开发框架,提供了非常丰富的常用串口api。本文先从最简单的串口调试助手开始,编写平台软件的串口控制界面 工程配置 QT 串口通信基于QT的QSerialPort类,先在…...
Netty核心原理与基础实战(二)——详解Bootstrap
接上篇:Netty核心原理与基础实战(一) 1 Bootstrap基础概念 Bootstrap类是Netty提供的一个便利的工厂类,可以通过它来完成Netty的客户端或服务端的Netty组件的组装,以及Netty程序的初始化和启动执行。Netty的官方解释是…...
C语言常见面试题:C语言中如何进行比较运算?
在C语言中,比较运算用于比较两个值的大小关系。比较运算符包括等于()、不等于(!)、大于(>)、小于(<)、大于等于(>)和小于等于࿰…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
