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

小结

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言探索:水仙花数的奥秘与计算

摘要&#xff1a; 水仙花数&#xff0c;一种特殊的三位数&#xff0c;其各位数字的立方和等于该数本身。本文将详细介绍水仙花数的定义、性质&#xff0c;以及如何使用C语言来寻找100至999范围内的水仙花数。 目录 一、水仙花数的定义与性质 二、用C语言寻找100至999范围内的…

重写Sylar基于协程的服务器(2、配置模块的设计)

重写Sylar基于协程的服务器&#xff08;2、配置模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

【PostgresSQL系列】 ltree简介及基于SpringBoot实现 ltree数据增删改查

本文将对PostgresSQL中的ltree进行相关概念介绍&#xff0c;并以示例代码讲解ltree数据增删改查功能的实现。 作者&#xff1a;后端小肥肠 目录 1.前言 2. 基础概念 2.1. ltree 2.2. lquery 2.3. ltxtquery 2.4. ltree函数及操作符 2.4.1. ltree函数 2.4.2. ltree操作符…

软考 系统分析师系列知识点之需求管理(3)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之需求管理&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 软件需求工程 第8节. 需求管理 11.8.4 需求跟踪 根据IEEE的定义&#xff0c;可跟踪性包含两个层面的含义&#xff1a;一个是开发过程的两个或多个产品之…

统计图表在线配置服务-百度 SugarBI的学习笔记

最近&#xff0c;有个产品要支持统计图表在线可配置&#xff0c;这样&#xff0c;当用户有新增统计指标的需求时&#xff0c;运维人员通过界面化配置&#xff0c;就可以增加统计指标了&#xff0c;不用开发写代码&#xff0c;画页面了。 上网查了下相关的组件&#xff0c;感觉…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…

曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作&#xff0c;遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰&#xff0c; 做一些概念区别的总结&#xff1a; 曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下&#xff0c;曲线拟合将产生一个函数&#xff0c;可用于…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现SPI控制OLED屏幕

上一篇&#xff1a; [嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集 [嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器 [嵌入式软件][启蒙篇][仿真平台] STM32F103实现IIC控制OLED屏幕 文章目…

Git 怎么设置用户的权限

在团队协作的软件开发中&#xff0c;对于版本控制系统Git来说&#xff0c;确保代码与数据的安全性至关重要。为了实现这一目标&#xff0c;Git提供了灵活且可定制的用户权限管理机制。下面将简单的探讨一下Git如何设置用户的权限&#xff0c;以及如何保护代码和数据。 用户身份…

提高 NFS Azure 文件共享性能

本文内容 适用于增加预读大小以提高读取吞吐量Nconnect另请参阅 本文介绍如何提高 NFS Azure 文件共享的性能。 适用于 展开表 文件共享类型SMBNFS标准文件共享 (GPv2)、LRS/ZRS 标准文件共享 (GPv2)、GRS/GZRS 高级文件共享 (FileStorage)、LRS/ZRS 增加预读大…

Spring Boot集成Redisson详细介绍

Redisson是一个用于Java的分布式和高可用的Java对象的框架&#xff0c;它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson&#xff0c;并展示一些基本用法…

git远程仓库基本操作

目录 gitremote &#xff08;查看远程仓库&#xff09; git remote add [仓库名] [url] git clone [url]&#xff08;克隆远程仓库到本地&#xff09; git push [名][分支名]&#xff08;提交到远程仓库&#xff09;​编辑 git pull [名][分支名]从远程仓库拉取​编辑 注意操作…

混乱字母排序——欧拉路数论

题目描述 小明接到一个神秘的任务&#xff1a;对于给定的 n 个没有顺序的字母对&#xff08;无序代表这两个字母可以前后顺序颠倒&#xff0c;区分大小写&#xff09;。请构造一个有 (n1) 个字母的混乱字符串使得每个字母对都在这个字符串中出现。 输入输出格式 输入格式 第…

three.js CSS2DRenderer、CSS2DObject渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"><…

SpringCloud_学习笔记_1

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

FairGuard游戏加固入选《CCSIP 2023中国网络安全行业全景册(第六版)》

2024年1月24日&#xff0c; FreeBuf咨询正式发布《CCSIP 2023中国网络安全行业全景册(第六版)》。本次发布的全景图&#xff0c;共计展示20个一级分类、108个细分安全领域&#xff0c;旨在为广大企业提供网络安全产品选型参考&#xff0c;帮助企业了解中国网络安全技术与市场的…

一道sql注入的ctf题目致使用phpmyadmin上传 webshell 拿后台权限

以下均为靶场测试环境渗透&#xff0c;非正式环境。 遇见登录框&#xff0c;直接万能密码’or(11)or’/1 直接登录成功并返回结果: 既然存在sql注入&#xff0c;那就用sqlmap跑一下吧&#xff1a; 输出所有的数据库&#xff1a; sqlmap -u <目标URL> --dbs 要输出数据库…

docker中三种常用的持久化数据的方式

文章目录 介绍1.docker run -v2.volumes3.bind mounts 介绍 “前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。” 在Docker中&#xff0c;有以下三种常用的持久化数据的方式&#xff0c;可…

Kotlin快速入门系列10

Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中&#xff0c;有两个对象参与处理同一个请求&#xff0c;接受请求的对象将请求委托给另一个对象来处理。与Java一样&#xff0c;Kotlin也支持委托模式&#xff0c;通过关键字by。 类委托 类的委托即一个类中定义的方…