【Redis】List类型

ops/2024/9/20 7:10:12/ 标签: redis, 数据库, 缓存, 学习, linux, 服务器, list

目录

List列表

命令

LPUSH

LPUSHX

RPUSH 

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LLEN

lrem

ltrim

lset

阻塞版本命令

BLPOP

BRPOP 

内部编码

使用场景

消息队列

分频道的消息队列

作为栈或者队列


List列表

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

列表类型的特点:

  • 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表
  • 区分获取和删除的区别
  • 列表中的元素是允许重复的


命令

LPUSH

将一个或者多个元素从左侧放入(头插)到list中。 

语法:

 LPUSH key element [element ...]

时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.

返回值:插⼊后 list 的⻓度。

⽰例:

LPUSHX

在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回

语法:

LPUSHX key element [element ...]

时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.

返回值:插⼊后 list 的⻓度。

⽰例:

RPUSH 

将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。

语法:

RPUSH key element [element ...]

时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.

返回值:插⼊后 list 的⻓度。

⽰例:

RPUSHX

在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。

语法:

RPUSHX key element [element ...]

时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.

返回值:插⼊后 list 的⻓度。

⽰例:

LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭。

语法:

LRANGE key start stop

时间复杂度:O(N)

返回值:指定区间的元素。

⽰例:

说明:

  • 在C++中,下标超出范围,一般认为这是一个”未定义行为“;可能会导致程序崩溃,也可能会得到一个不合法的数据,还可能会得到一个看起来合法但是是错误的数据,也有可能恰好的到一个符合要求的数据;缺点:程序员不一定在第一时间发现问题;优点:效率非常高
  • 在Java中,下标超出范围,一般会抛出异常,多出一步合法下标的验证 缺点:效率或者速度相比C++比较慢 优点:出现问题能够及时发现
  • 在Redis中并没有采用上述两种设定,Redis的做法是直接尽可能的获取到给定区间的元素,如果区间非法,比如超出下标就会尽可能的获取对应的内容

LPOP

list 左侧取出元素(即头删)。

语法:

LPOP key

时间复杂度:O(1)

返回值:取出的元素或者 nil。

⽰例:

RPOP

list 右侧取出元素(即尾删)。

语法:

RPOP key

时间复杂度:O(1)

返回值:取出的元素或者 nil。

⽰例:

LINDEX

获取从左数第 index 位置的元素。

语法:

LINDEX key index

时间复杂度:O(N)

返回值:取出的元素或者 nil。

⽰例:

说明:并没有RINDEX命令,如果我们想从左边开始获取元素,可以让index设置为负数; 

LINSERT

在特定位置插⼊元素。

语法:

LINSERT key <BEFORE | AFTER> pivot element

时间复杂度:O(N)

返回值:插⼊后的 list ⻓度。

⽰例: 

LLEN

获取 list ⻓度。

语法:

LLEN key

时间复杂度:O(1)

返回值:list 的⻓度。

⽰例:

lrem

删除指定个数的指定元素

语法:

LERM key count element

时间复杂度:O(K)

返回值:删除元素的个数

示例:

说明:

  • 当count>0时,从list的左边开始删除
  • 当count<0时,从list的右边开始删除
  • 当count=0时,删除 list中的所有元素 

ltrim

保留start和stop之间区间的内的元素(区间外面两边的元素就直接被删除了)

语法:

LTRIM key start stop

时间复杂度:O(K)

返回值:执行成功返回OK

示例:

lset

根据下标修改元素

语法:

LSET key index element

时间复杂度:O(N)

返回值:执行成功返回OK

示例:


阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,除了:

  • 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执⾏其他命令,但要求执⾏该命令的客⼾端会表现为阻塞状态。
  • 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令⽴即返回。
  • 如果多个客⼾端同时多⼀个键执⾏ pop,则最先执⾏命令的客⼾端会得到弹出的元素。

BLPOP

LPOP的阻塞版本

语法:

 BLPOP key [key ...] timeout

时间复杂度:O(1)

返回值:取出的元素或者 nil。

示例:

BRPOP 

RPOP的阻塞版本

语法:

 BRPOP key [key ...] timeout

时间复杂度:O(1)

返回值:取出的元素或者 nil。

示例:和上面BLPOP的用法相似就不演示了


内部编码

在Redis 5版本中,List的内部编码主要是quicklist。quicklist是Redis 3.2版本引入的一种新的数据结构,它是ziplist和linkedlist的结合体,旨在更好地平衡内存使用和访问速度。

quicklist通过维护一个双向链表,链表的每个节点都是一个ziplist。这种设计使得quicklist既能够像ziplist一样节省内存(因为ziplist会将多个元素压缩存储在一起),又能够像linkedlist一样快速地在两端进行插入和删除操作(因为linkedlist的双向特性)。


使用场景

消息队列

如下图所⽰,Redis 可以使⽤ lpush + brpop 命令组合实现经典的阻塞式⽣产者-消费者模型队列,⽣产者客⼾端使⽤ lpush 从列表左侧插⼊元素,多个消费者客⼾端使⽤ brpop 命令阻塞式地从队列中"争抢" 队⾸元素。通过多个客⼾端来保证消费的负载均衡和⾼可⽤性。

Redis阻塞消息队列模型

分频道的消息队列
 

如下图所⽰,Redis 同样使⽤ lpush + brpop 命令,但通过不同的键模拟频道的概念,不同的消费者可以通过 brpop 不同的键值,实现订阅不同频道的理念。

Redis分频道阻塞消息队列模型

作为栈或者队列

选择列表类型时,请参考:

同侧存取(lpush + lpop 或者 rpush + rpop)为栈

异侧存取(lpush + rpop 或者 rpush + lpop)为队列


今天对Resid中list列表类型的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 


http://www.ppmy.cn/ops/93733.html

相关文章

如何从戴尔笔记本电脑硬盘恢复数据

“如何从坏掉的戴尔笔记本电脑硬盘中恢复数据&#xff1f;我无法访问硬盘&#xff0c;但我确实需要从硬盘中检索数据。我有很多重要文件被困在那里。” 人们学习如何从戴尔笔记本电脑硬盘恢复数据的原因有很多&#xff0c;例如有意或无意删除、硬盘格式化、安全警告隔离受病毒…

3.类和对象(中)

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数&#xff08;就是我们不写&#xff0c;编译器会默认生成一份&#xff09;。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0…

解决echarts中tooltip的换行问题

今天收到产品提来的bug&#xff0c;说我的echarts的tooltip在手机端文字太多的话会因为太长而被遮住&#xff0c;类似于这样 于是便想着修改配置&#xff0c;发现不行&#xff0c;无论是修改textStyle还是extraCssText&#xff0c;都无法达到换行的效果&#xff0c;只好在forma…

【RISC-V设计-09】- RISC-V处理器设计K0A之CIC

【RISC-V设计-09】- RISC-V处理器设计K0A之CIC 文章目录 【RISC-V设计-09】- RISC-V处理器设计K0A之CIC1.简介2.顶层设计3.端口说明4.代码设计5.仲裁代码6.总结 1.简介 核内中断控制器&#xff08;Core Interrupt Controller&#xff0c;简称CIC&#xff09;是管理和仲裁中断的…

flink web监控

作者&#xff1a;南墨 监控指标 进入Flink的原生页面&#xff0c;需要从yarn的原生页面的后台链接进入&#xff0c;如下图&#xff1a; 这里必须要用supergroup组的用户或者flink提交任务的用户&#xff08;如果该用户是机机用户不能登录&#xff09;才能够看到任务。 系统监…

(javaweb)分层解耦

目录 一.三层架构 二.分层解耦 三.IOC&DI入门 四.IOC详解 五. DI详解 一.三层架构 复用性差&#xff0c;难以维护和管理 前端发起请求&#xff0c;先会到达controller&#xff0c;再调用service进行逻辑处理&#xff0c;逻辑处理的前提是先拿到数据&#xff0c;到dao…

基于SpringBoot的体育馆管理系统的设计与实现

TOC springboot162基于SpringBoot的体育馆管理系统的设计与实现 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

PyTorch 基础学习(6)- 函数API

系列文章&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…

KillWxapkg-自动化反编译微信小程序工具(附安装包)

KillWxapkg是一款纯Golang实现&#xff0c;一个用于自动化反编译微信小程序、小程序安全评估工具工具&#xff0c;小程序安全利器&#xff0c; 可以自动解密&#xff0c;解包&#xff0c;可还原工程目录&#xff0c;支持Hook&#xff0c;小程序修改&#xff0c;支持微信开发者工…

k8s 单机 部署

k8s 单机 部署 香港服务器 centos7.6 2核4G 30M 搞个k8s单机部署搞了好几天 就是一直出错 遇到了好多次镜像的错误 真的是日了&#x1f415;了索性 搞个香港服务器&#xff0c;不折腾镜像源了Deploy Kubernetes On-Premises Using CentOS 7 — Part 1 https://medium.com/sar…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

基于SpringBoot的企业资产管理系统

TOC springboot117基于SpringBoot的企业资产管理系统 系统概述 1.1 研究背景 智慧养老是面向居家老人、社区及养老机构的传感网系统与信息平台&#xff0c;并在此基础上提供实时、快捷、高效、低成本的&#xff0c;物联化、互联化、智能化的养老服务。 随着科技进步&#…

【qt】QMainWindow下实现一个记事本

之前我们学过QWidget&#xff0c;QMainWindow会在ui界面多一个菜单 先实现ui界面 1.添加文本编辑&#xff0c;实现可以写多行 2.将文本编辑放大&#xff0c;拖动即可 3.编辑菜单栏 4.然后我们要实现对应子列表的功能&#xff0c;但是在这里不能转到槽&#xff0c;所以我们…

关于自己部署AI大模型踩的坑(一)——硬件篇

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.&#xff08;钢铁侠中的机器人管家&#xff09;。 上一篇写了我最近在部署自己的大模型&#xff0c;使用llama3.1&#xff0c; 和通义千问2。虽然最终结果也是成功了&#xff0c;过程却十分地坎坷。 所以这一篇文章一是总结其中…

uniapp版本更新除了plus.runtime.getProperty的解决办法

以下是展示图 带尺寸的图片: 首先把以下代码放到想要更新弹出的页面 //template部分<uni-popup ref"popup" background-color"#fff"><versionUp handleCloseVersion"closeVersion"></versionUp></uni-popup>//script…

Mysql——对数据基本操作(增删查改)——操纵语言(DML)

之前的创建数据库和创建表&#xff0c;类型、约束都是用的DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构 代表指令: create, drop, alter 那么现在我们来学习数据操纵语言 DML【data manipulation language】 数据操纵语言&#xff0c;用来…

使用Selenium爬取网络页面

在现代网络数据分析和自动化测试中&#xff0c;Selenium 是一个强大而流行的工具。它不仅可以帮助开发者自动化浏览器操作&#xff0c;还能用于爬取网络页面。本文将介绍如何使用 Selenium 爬取网络页面&#xff0c;包括基本设置、常用操作及一些实用的技巧。 一、什么是 Selen…

腾讯cdg提前批一面0726

介绍项目 黑马商城 为什么使用rabbitmq 用于异步更新订单 扣减余额后异步更新订单失败怎么办 分布式事务回滚 什么是接口幂等性&#xff0c;怎么实现 接口幂等性是指同一个接口在短时间点击多次都之后返回只执行一次的结果。 Token机制&#xff1a; 生成Token&#xff1a;在客户…

点赞功能开发

文章目录 1.点赞收藏功能设计1.示意图2.描述1.使用redis记录的数据2.数据库的设计3.功能设计1.新增点赞2.取消点赞3.查询当前题目被点赞的数量4.查询当前题目被当前用户是否点过赞5.我的点赞 2.代码生成器的使用1.找到代码生成器在磁盘的位置&#xff0c;直接复制到项目下2.导入…

微信小程序中实现自动滚动

使用scroll-view组件的scroll-into-view属性&#xff1a; <scroll-view class"container" scroll-y"{{true}}" scroll-into-view"recordBottomScroll"><view class"text_style" style"color: #252526;">{{te…