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语言中,比较运算用于比较两个值的大小关系。比较运算符包括等于()、不等于(!)、大于(>)、小于(<)、大于等于(>)和小于等于࿰…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...