Redis -- list列表

news2024/9/29 23:23:48

只有克服了情感的波动,才能专心致志地追求事业的成功


目录

列表

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时间直到时间到达或者队列中被别的客户端插入了元素。

小结

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

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

相关文章

PPT录屏功能在哪?一键快速找到它!

在现代办公环境中&#xff0c;ppt的录屏功能日益受到关注&#xff0c;它不仅能帮助我们记录演示文稿的播放过程&#xff0c;还能将操作过程、游戏等内容完美录制下来。可是很多人不知道ppt录屏功能在哪&#xff0c;本文将为您介绍ppt录屏的打开方法&#xff0c;以帮助读者更好地…

网络协议与攻击模拟_14DNS欺骗

DNS欺骗就是利用某种方式将我们访问的域名解析到其他服务器上&#xff0c;从而使得我们无法正常访问到原本我们想要访问的网站。 一、DNS欺骗过程 首先在windows server 2016虚拟机上搭建网站服务&#xff0c;kali作为攻击机从而实现中间人攻击&#xff0c;使用ettercap工具的…

阿里云a10GPU,centos7,cuda11.2环境配置

Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…

echarts中绘制3D三维地球

简介 echarts中的三维地球&#xff0c;需要用到世界地图json数据&#xff0c;我把json文件放到我的资源中&#xff0c;有需要的自行下载。 安装插件 // 安装echats npm install echarts --save npm install echarts-gl --save 项目中引用 1&#xff0c;引入安装的echarts…

【数据结构】单向链表实现 超详细

目录 一. 单链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项&#xff1a;帮助高效记忆和理解 2.链表的基本功能接口 2.0 创建一个 链表 2.1 链表的打印 3.链表的创建新节点接口 4.链表的节点插入功能接口 4.1 尾插接口 4.2 头插接口 4.3 指定位…

Jupyter Notebook中的%matplotlib inline详解

Jupyter Notebook中的%matplotlib inline详解 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;什么是魔术命令&#x1f333;&#x1f333;%matplotlib inline详解&#x1f333;(&#x1f448;直入主题请点击)&#x1f333;小结&#x1f333;&…

华为FreeClip耳机可以调节音量大小吗?附教程!

不会只有我一个人吧&#xff1f;都用华为FreeClip耳机一段时间了&#xff0c;才发现它竟然不支持在耳机上直接调节音量&#xff0c;也是没谁了&#xff01;但是后来自己摸索了一下&#xff0c;发现了华为FreeClip耳机原来是几个简单有效的调节音量大小的方法滴~不得不说&#x…

0202-1-处理机调度与死锁

第三章:处理机调度与死锁 处理机调度算法的目标 处理机调度算法的共同目标 资源利用率:CPU的利用率CPU有效工作时间/(CPU有效工作时间CPU空闲等待时间)公平性平衡性策略强制执行 批处理系统的目标 平均周转时间短系统吞吐量高处理机利用率高 分时系统的目标 响应时间快均…

LeetCode:141和142,环形链表之追及相遇和快慢指针的运用

这两个题是相关联的&#xff0c;主要做法为哈希和快慢指针&#xff0c;当然像博主我&#xff0c;不看解析只会O&#xff08;n^2&#xff09;的暴力遍历&#xff0c;太惨了&#xff0c;不过&#xff0c;快慢指针还是很好理解的&#xff0c;是一个追及的问题&#xff0c; 目录 …

半桥式三相无刷直流电动机不同导通角的性能的变化

半桥式三相无刷直流电动机不同导通角的性能的变化 syms Omega clear clcOmega0pi/180*120 for Omega_x[pi/180*120,pi/180*130,pi/180*140,pi/180*150,pi/180*160,pi/180*170,pi/180*180]Omega_x*180/piOmega_x_0 (4*sin(Omega_x/2)/(Omega_xsin(Omega_x)))/(4*sin(Omega0/2)/…

Javaweb之SpringBootWeb案例之yml配置文件的详细解析

4.2 yml配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&am…

了解UDP发送过快导致的问题和对应解决方案

在当今这个以数据为核心的时代&#xff0c;企业对于数据传输的速度和稳定性有着日益增长的需求。UDP凭借其低延迟和高效率的特性&#xff0c;在实时通信和大规模数据传输领域扮演着关键角色。然而&#xff0c;UDP的无连接特性和缺乏可靠性也给数据传输带来了挑战&#xff0c;尤…

Docker极速入门掌握基本概念和用法

1、Docker概念 1.1什么是docker Docker是一个快速交付应用、运行应用的技术&#xff0c;具备以下优势 可将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通…

【Springcloud篇】学习笔记一(一至三章):微服务介绍、构建环境

零基础微服务架构理论入门介绍 一个基于分布式的服务架构应该含有的架构内容如下&#xff1a; 1.1SpringCloud是什么 1.2基于微服务的系统 1.3服务与之对用的技术 1.4课程目录 第一章_SpringBoot和SpringCloud版本选择 详细可见SpringCloud2020.mmap文件 1.概述 2.SpringBoo…

Fashion MNIST数据集介绍及基于Pytorch下载数据集

Fashion MNIST数据集介绍及基于Pytorch下载数据集 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;Fashion MNIST数据集简介&#x1f333;Fashion MNIST数据集的类别说明Fashion MNIST数据集图片示例 &#x1f333;基于PyTorch下载Fashion MN…

ElasticSearch-SpringBoot整合ElasticSearch

六、SpringBoot整合ElasticSearch 1、浏览官方文档 1、查找跟ES客户端相关的文档 使用Java REST Client 选择Java Hight Level REST Client 2、创建项目的准备 1.找到原生的依赖 2.找到对象 3.分析这个类里面的方法 3、正式创建项目 1.创建工程 2.导入依赖 注意依赖版本…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

RISC-V指令格式

RISC-V指令格式 1 RISC-V指令集命名规范2 RISC-V指令集组成2.1 基础整数指令集2.2 扩展指令集 3 RISC-V指令格式3.1 指令表述3.2 指令格式 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 RISC-V指令集命名规范 前面提到过RV32I&#xff0c;这是…

C#,哥伦布数(Golomb Number)的算法与源代码

1 哥伦布数&#xff08;Golomb Number&#xff09; 哥伦布数&#xff08;Golomb Number&#xff09;是一个自然数的非减量序列&#xff0c;使得n在序列中正好出现G&#xff08;n&#xff09;次。前几个15的G&#xff08;n&#xff09;值为&#xff1a;1 2 2 3 3 4 4 4 5 5 5 6…

【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)

神经网络整体架构 类似于人体的神经元 神经网络工作原来为层次结构&#xff0c;一层一层的变换数据。如上述示例有4层&#xff0c;1层输入层、2层隐藏层、1层输出层神经元&#xff1a;数据的量或矩阵的大小&#xff0c;如上述示例中输入层中有三个神经元代表输入数据有3个特征…