Redis常用命令——List篇

news2024/11/29 4:36:29

 

    提到List,我们第一时间想到的就是链表。但是在Redis中,List更像是一种双端队列,例如C++中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解,希望本篇文章会对你有所帮助。

文章目录

一、List简介

二、相关命令

LPUSH

LRANGE

LPUSHX

RPUSH 和 RPUSHX

LPOP 和 RPOP

LINDEX

LINSER

LLEN

LREM

LTRIM

LSET

BLPOP 和 BRPOP

三、小结


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Redis 👀

💥 标题:Redis常用命令——List篇💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、List简介

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

  Redis中的List还是有别于其他的链表的,其特点如下:

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

  注意:上述提到列表是有序的,这里的有序并非只的是大小的有序,而是指的相对顺序是有序的,也就是相对顺序改变了,那么该列表就与原列表不同了!

  提到列表中的元素可以重复,那么我们就应该想到Hash是不允许有重复的 field 的,同时我们在设置String时,其对应的key也是不可以重复的。

二、相关命令

LPUSH

  LPUSH命令是用于将一个或多个值插入到列表的头部。语法:

LPUSH key value [value ...]

  返回值为插入完成后,列表的长度。具体如下:

LRANGE

  LRANGE命令是用于获取列表中指定范围内的元素。语法:

LRANGE key start stop

  参数:

  • key: 列表的键名。
  • start: 起始索引,从0开始计数(包含该索引处的元素)。
  • stop: 结束索引,从0开始计数(包含该索引处的元素)。

  返回值: 指定范围内的元素构成的列表。注意:这里的索引可以为负数,其中-1为该链表的最后一个元素,我们也可以把 -1 看成 len - 1。具体我们看如下实例:

  其实这里有一个问题:假如我们给的索引查过了列表的范围,那么Redis还能够正确返回对应的值吗?我们看如下情况:

LPUSHX

  LPUSHX命令是用于将一个值插入到已存在的列表头部(左侧)。其用法与LPUSH一样,唯一差别就是如果该链表不存在,那么就插入失败。简单来说:若指定的key不存在,则LPUSHX命令不会进行任何操作,返回值为0。这与LPUSH命令的区别在于,LPUSH命令在key不存在时会创建一个空列表并执行插入操作。具体如下:

RPUSH 和 RPUSHX

  学完LPUSH 和 LPUSHX后,那么RPUSH 和 RPUSHX就相当容易了。LPUSH就是进行头插,RPUSH是尾插。其他两者的用发、语义等全部一样。这里就不再过多演示,大家可自行练习。

LPOP 和 RPOP

  LPOP是头删, RPOP是尾删。其语法格式:

LPOP key
RPOP key
  • LPOP和RPOP命令都是用于移除并返回列表的第一个或最后一个元素。
  • 如果列表不存在,这两个命令将返回nil。
  • 如果存在,那么返回所删除的元素。
  • 这两个命令的时间复杂度均为O(1),因此能够在常数时间内完成操作。
  • 通过使用LPOP和RPOP命令,可以方便地实现先进先出(FIFO)或者后进先出(LIFO)的数据结构。

  下面我们看一下具体实例:

LINDEX

  LINDEX命令用于获取列表中指定索引位置的元素。其基本语法为:

LINDEX key index

  其中,key是存储列表的键名,index是要获取元素的索引。索引从0开始,负数索引表示从列表末尾开始倒数。如果是非法下表,那么返回nil。具体实例如下:

  注意,此操作的时间复杂度为O(n),并不是O(1)。

LINSER

  LINSERT命令用于向列表中特定元素的前面或后面插入新元素。其语法如下:

LINSERT key BEFORE|AFTER pivot value

  其中,key是列表的键名,pivot是列表中的某个元素,value是要插入的新元素。BEFORE和AFTER是指定插入位置的关键词,表示在pivot元素之前或之后进行插入。其返回值为插入成功的列表的长度。具体如下:

LLEN

  LLEN命令用于返回列表键的长度的命令。语法:

LLEN key

  参数:

  • key: 要获取长度的列表键名。

  返回值:

  • 列表的长度,如果键不存在,则返回0。

  该命令较为简单,我们直接看实例:

LREM

  LREM命令是用于移除列表中与给定值相等的元素的命令。具体而言,它可以从列表中删除指定数量的与给定值相等的元素。其语法:

LREM key count value

  参数:

  • key: 要操作的列表键名。
  • count: 指定删除元素的数量,可以为正数、负数或零。
    • 当count为正数时,表示从列表头部开始向尾部搜索,并移除与value相等的元素,直到数量达到count为止。
    • 当count为负数时,表示从列表尾部开始向头部搜索,并移除与value相等的元素,直到数量达到count的绝对值为止。
    • 当count为零时,表示移除所有与value相等的元素。
  • value: 要移除的元素的值。

  返回值:

  • 被移除的元素数量。

  我们结合下述例子来理解一下。首先创建一个新的列表,其中包含的元素如下:

  

  然后我们从左往右删除3个1,具体如下:

  我们再次从右向左删除3个2,具体如下:

  最后我们删除所有的3,具体如下:

LTRIM

  LTRIM命令是用于修剪存储在列表(List)数据结构中的元素。该命令可以删除列表中指定范围以外的所有元素,并保留指定范围内的元素。语法:

LTRIM key start stop

  其中,key是要操作的列表的键名,start和stop是要保留的元素的起始索引和结束索引(包含在内)。索引从0开始,负数索引表示从列表末尾开始计算。具体如下:

LSET

 LSET命令用于设置列表(List)数据结构中指定索引位置的元素的值。该命令可以帮助你更新列表中任意位置的元素。 语法为:

LSET key index value

  其中,key是要操作的列表的键名,index是要设置的元素的索引位置,value是要设置的新值。我们来看一下实例:

  注意,该命令的时间复杂度为O(n)。

BLPOP 和 BRPOP

  BLPOP命令是用于阻塞式(Blocking)左端弹出操作的命令,它用于从一个或多个列表中取出最左边(头部)的元素,并返回该元素及其所属列表的键名。

  问题来了:什么是阻塞式弹出呢?当有至少一个列表包含元素时,BLPOP会立即弹出并返回最左边的元素和其所属列表的键名;如果所有给定的列表都为空,则BLPOP会阻塞等待直到超时时间为止。简单来说就是如果列表为空,那么就会阻塞,之后有元素后会再被唤醒!但阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。其语法:

BLPOP key [key ...] timeout

  下面我们看一个实例:

  上述key对应的value链表为空,所以被阻塞了。当我们从另一个客服端向此插入后,就会立刻返回:

  那要是尝试获取多个列表的key呢? 多个key对应多个list,这多个list哪个有元素了,就会返回哪个元素。如果多个客户端同时多一个键执行pop,则最先执行命令的客户端会得到弹出的元素。具体看如下实例:

  从上述的返回值中我们就能能看出来是弹出的那个list的元素。实际上BRPOP和BLPOP是一样的,这里就不再过多解释!

三、小结

  有关列表的命令已经介绍完毕,下图是这些命令的作用和时间复杂度,可以用来做参考。

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

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

相关文章

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

高考志愿选专业,如何分析自己的兴趣爱好?

之所以在选择专业的时候比较迷茫,就是对自己不够了解,没有分析过自己的兴趣爱好,所以也不知道如何选择适合自己的专业,但是他们又不得不做出更深入的了解,因为专业的选择将关系到未来的职业道路和生活方向。 对于绝大…

java 大型企业MES生产管理系统源码:MES系统与柔性化产线控制系统的关系、作用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统”,它为操作人员/管理人员提供计划的执行、跟踪以及所有资源(人、设备、物料、客户需求等)的当前状态。 MES系统与柔性化产线控制系统的关系 MES(制造执行系统)是一种…

Apifox的使用

1、了解Apifox的工具特点和使用方法 2、使用Apifox辅助生成接口文档,尝试使用Apifox进行其他前后端调试。 Apifox IDEA 插件快速上手 | Apifox 帮助文档 Apifox IDEA 插件来啦!是真的超好用!_哔哩哔哩_bilibili 21分钟学会Apifox_哔哩哔哩…

Python 机器学习 基础 之 【实战案例】中药数据分析项目实战

Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 目录 Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 一、简单介绍 二、中药数据分析项目实战 三、数据处理与分析实战 1、数据读取 2、中药材数据集的数据处理与分析 2.1数据清洗 2.2、 提取别…

什么是大型语言模型 ?

引言 在本文[1]中,我们将从高层次概述大型语言模型 (LLM) 的具体含义。 背景 2023年11月,我偶然间听闻了OpenAI的开发者大会,这个大会展示了人工智能领域的革命性进展,让我深深着迷。怀着对这一领域的浓厚兴趣,我加入了…

计算机网络--计算机网络概念

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 0.计算机网络简介 0.2 计算机网络的功能简介 数据通信(连通性)资源共享: 软件硬件数据 分布式处理 多台计算机各自承担同…

每日一题——Python实现PAT甲级1015 Reversible Primes(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 is_prime函数分析: decimal_to_base函数分析: 主循…

Segment Anything

参考:【图像分割】Segment Anything(Meta AI)论文解读-CSDN博客 背景 提示分割任务:在给定任何分割提示下返回一个有效的分割掩码目标:开发一个可提示的图像分割的基础模型,在一个广泛的数据集上预训练&a…

【网络安全的神秘世界】在win11搭建pikachu靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…

数据结构--二叉树(二)

链式二叉树 链式二叉树是链式树集合中的一种,该树的每个根节点最多只有两个孩子节点,我们一般用左右孩子来称呼,在初学链式二叉树时,由于大家对链式二叉树的结构掌握还不够深入,为了降低本章的学习难度及成本&#xff…

大模型多轮问答的两种方式

前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图,而在常见的使用大模型进行多轮对话方式中,我接触到的只有两种方式: 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型&#xff0c…

u盘内容无故消失了是什么原因?u盘部分内容无故消失了怎么恢复

在数字化时代,U盘作为便携存储设备,承载着许多重要的数据。然而,有时我们可能会遭遇U盘部分内容无故消失的情况,这无疑给我们的工作和生活带来了不小的困扰。本文将为您解析U盘内容消失的可能原因,并分享几招实用的数据…

[经验] 场效应管是如何发挥作用的 #知识分享#学习方法#职场发展

场效应管是如何发挥作用的 在现代电子技术领域,场效应管(MOSFET)是一种重要的半导体元器件。它的作用非常广泛,例如在集成电路中扮演着关键的角色。在本文中,我们将详细探讨场效应管的作用及其在实际应用中的意义。 简…

[职场] 社保和商业保险有什么区别?可以只买商保不买社保吗? #微信#经验分享#媒体

社保和商业保险有什么区别?可以只买商保不买社保吗? 我们在提到社保和商业保险时,经常会听到这样一句话:“社保是基础,商保是补充。” 为什么会这样说呢?社保和商保有什么区别呢?今天&#xf…

AutoCAD Mechanical机械版专业的计算机辅助设计软件安装包下载安装!

AutoCAD机械版作为一款专业的计算机辅助设计软件,不仅具备卓越的二维绘图功能,更是拥有令人瞩目的3D建模工具,为机械设计师们提供了前所未有的创作空间。 在AutoCAD机械版的3D建模环境中,用户可以借助一系列简洁明了的命令&#…

SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)

目录 SMS 环境调试 从阿里云云市场中购买第三方短信服务 调试短信验证码功能 实战开发 封装组件 对外接口 调用演示 SMS 环境调试 从阿里云云市场中购买第三方短信服务 a)进入阿里云首页,然后从云市场中找到 “短信” (一定要从 云…

SpringBoot高手之路-springboot原理篇

配置文件优先级 SpringBoot原理篇-多环境配置

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…

Pytorch手把手实作-Generative Adversarial Network (GAN)

文章目录 一、说明二、GAN的介绍三、生成器和鉴别器四、代码实现 一、说明 前言废话免了,会进来看文章内容的只有四种人:1. 只想知道皮毛,GAN在干什么的 2. 想知道细节怎么把GAN训练起来;3. 收藏在收藏夹或是书签当作有看过了&am…