【Redis】list常用命令内部编码使用场景

文章目录

  • 前置知识
    • 列表类型的特点
  • 命令
    • LPUSH
    • LPUSHX
    • RPUSH
    • RPUSHX
    • LRANGE
    • LPOP
    • RPOP
    • LINDEX
    • LREM
    • LINSERT
    • LTRIM
    • LSET
    • LLEN
  • 阻塞版本命令
    • BLPOP
    • BRPOP
  • 命令总结
  • 内部编码
    • 测试内部编码
  • 使用场景
    • 消息队列
      • 分频道的消息队列
    • 模拟栈和队列

前置知识

列表类型是⽤来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储232 ​ - 1个元素。在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等,列表是⼀种⽐较灵活的数据结构,它可以充当栈和队列的⻆⾊,在实际开发上有很多应⽤场景

列表两端插入和弹出操作

image-20231026155517093

约定最左侧元素下标是0

列表的获取、删除等操作

image-20231021174300326

列表类型的特点

1.列表类型是有序的。这意味着可以通过索引下标获取某个元素或者某个范围的元素列表

2.区分获取和删除的区别:

  • lrem1 b是从列表中把从左数遇到的前1个b元素删除,这个操作会导致列表的⻓度从5变成4
  • 但是执⾏lindex 4只会获取元素,但列表⻓度是不会变化的

3.列表中的元素是允许重复的

image-20231021204004790


命令

LPUSH

将⼀个或者多个元素从左侧放⼊(头插)到list中 ,如果key不存在的话,会新建key

语法:LPUSH key element [element ...] 

返回值:插⼊后list的⻓度 时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数

image-20231023200043815

LPUSHX

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

语法:LPUSHX key element [element ...] 

返回值:插⼊后list的⻓度 时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数

image-20231023200120020

RPUSH

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

语法:RPUSH key element [element ...] 

返回值:插⼊后list的⻓度 时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数

image-20231023200156410


RPUSHX

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

语法:RPUSHX key element [element ...] #此处的X => exists

返回值:插⼊后list的⻓度 时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数

image-20231023200219891


LRANGE

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

语法:LRANGE key start stop 

返回值:指定区间的元素 时间复杂度:O(N)

image-20231023200409815

注意1:前面的序号是专门给结果集使用的序号,和list的下标无关

注意2:在C++当中,下标超出范围,会认为是一个未定义行为=>可能导致程序崩溃/得到一个不合法数据/得到一个看起来合法但是错误的数据/得到一个恰好符合要求的数据

  • 优点:效率最高 缺点:程序员不一定能第一时间发现问题

而在redis当中:尽可能的获取到给定区间的元素,如果给定区间非法,比如超出下标,那么就会尽可能获取对应的内容


LPOP

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

语法:LPOP key

返回值:取出的元素或者nil 时间复杂度:O(1)

image-20231023200541071

RPOP

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

语法:RPOP key 

返回值:取出的元素或者nil 时间复杂度:O(1)

image-20231023200613300

LINDEX

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

语法:LINDEX key index

返回值:取出的元素,如果下标非法那么返回nil 时间复杂度:O(N)

image-20231023200701034


LREM

指定删除list当中的元素

语法:LREM key count value #count:要删除的个数 element:要删除的值

根据count的值不同,决定怎么删除:

image-20231026161723434

  • c o u n t > 0 count > 0 count>0:从前往后删除count个值为element元素
  • c o u n t < 0 count < 0 count<0:从后往前删除count个值为element元素
  • c o u n t = 0 count = 0 count=0:删除所有值为element的元素

image-20231026162139172

区分获取和删除元素的区别:

  • lindex能获取元素的值,lrem也能获取被删除元素的值

LINSERT

在特定位置插⼊元素

语法:LINSERT key <BEFORE | AFTER> pivot element 

返回值:插⼊后的list⻓度 时间复杂度:O(N)

  • before:在element前面插入
  • after:在element后面插入

image-20231023201016253

注意:如果要插入的列表当中,存在多个基准值,此时会根据基准值找到对应的位置 => 从左往右找,找到第一个符合基准值的位置,然后对应的在它前面/后面插入元素


LTRIM

只保存 [ s t a r t , s t o p ] [start,stop] [start,stop]之间的元素,区间之外的两边元素被删除

语法:LTRIM key start stop 

image-20231026163432595


LSET

根据下标修改元素,下标从0开始,可以是负数。

语法:LSET key index element

注意:如果index下标越界,那么会报错

image-20231026163621928

LLEN

获取list⻓度

语法:LLEN key 

返回值:list的⻓度 时间复杂度:O(1)

image-20231023201123440


阻塞版本命令

blpop和brpop是lpop和rpop的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,不同之处如下:

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

BLPOP

语法:BLPOP key [key ...] timeout 

返回值:取出的元素或者超时返回nil 时间复杂度:O(1)

image-20231023201506694

返回的结果是一个二元组:告诉我们当前数据来自哪个key,告诉我们取到的数据是什么


BRPOP

语法:BRPOP key [key ...] timeout 

返回值:取出的元素或者nil 时间复杂度:O(1)


注意:blpop和brpop都可以同时去尝试获取多个key的列表的元素,如果等待的其中一个list当中有元素,那么立马取出元素返回,不会阻塞

如果多个客户端同时对一个键执行pop,那么最先执行命令的客户端会得到弹出的元素


命令总结

image-20231021205627202


内部编码

列表类型的内部编码有3种:

  • ziplist(压缩列表):当列表的元素个数⼩于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的⻓度都⼩于list-max-ziplist-value配置(默认64字节)时,Redis会选⽤ziplist来作为列表的内部编码实现来减少内存消耗==>将数据按照更紧凑的压缩形式进行表示,但是当元素个数多了,操作起来效率会降低
  • linkedlist(链表):当列表类型⽆法满⾜ziplist的条件时,Redis会使⽤linkedlist作为列表的内部实现

quicklist:相当于是链表和压缩列表的结合,整体还是一个链表,但是链表的每个节点是一个压缩列表,每个压缩列表都不让它太大,同时把多个压缩列表通过链式结构连接起来

测试内部编码

1)当元素个数较少且没有⼤元素时,内部编码为ziplist:

2)当元素个数超过512时,内部编码为linkedlist:

3)当某个元素的⻓度超过64字节时,内部编码为linkedlist:


使用场景

消息队列

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

image-20231021210736988

brpop:阻塞操作,当列表为空的时候,会阻塞等待,直到其它客户端push了元素,谁先执行这个brpop命令,谁就可以拿到这个新来的元素,可以构成一个"轮询式"获得元素的效果。每个获取到元素的消费者都需要重新执行brpop

分频道的消息队列

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

image-20231021210806851

比如:一个通道用于传输短视频数据,一个通道用于传输弹幕,一个通道用于传输点赞,转发,收藏数据,一个通道用于传输评论数据

搞成多个频道,就可以在某种数据发生问题的时候,不会对其他数据造成影响(解耦合)

模拟栈和队列

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

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

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

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

相关文章

第一次实操Python+robotframework接口自动化测试

目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出&#xff0c;通过关键字的封装实现一定意义上的脚本与用例的脱离&#xff01; robot framework 的安装不过多说明&#xff0c;网上资料比较太多~ 实例&#xff1a;&#xff01;&#xff01;&#xff01;&#xff01…

AI:80-基于深度学习的医学图像分割与病变识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

day55 反向解析和视图层精确定位

上周内容回顾 orm的增删改查 1. 查询 from app01 import models models.UserInfo.objects.all() # 查询所有的字段信息和数据 resmodels.UserInfo.objects.first() # 查询一条&#xff0c;而且是第一条&#xff0c;queryset对象&#xff0c;列表套对象的形式 if res:res[0] t…

【表面重建】第一篇:delaunay三角化(未完)

文章目录 声明delaunay三角片的特性实现delaunay算法的分类生长算法逐点插入算法分治算法基于Bowyer-Watson算法 code调用scipy的API调用cgal的API 参考来源 声明 本帖持续更新中最近一次更新日期&#xff1a;2023.11.13如有纰漏望指正&#xff01; delaunay三角片的特性 de…

Flink SQL 表值聚合函数(Table Aggregate Function)详解

使用场景&#xff1a; 表值聚合函数即 UDTAF&#xff0c;这个函数⽬前只能在 Table API 中使⽤&#xff0c;不能在 SQL API 中使⽤。 函数功能&#xff1a; 在 SQL 表达式中&#xff0c;如果想对数据先分组再进⾏聚合取值&#xff1a; select max(xxx) from source_table gr…

2022年06月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 Python中 print(“八进制{: o}”.format(12)) 正确的输出结果是?( ) A: 八进制:O B: 八进制:O14 C: 八进制14O D: 八进制14 答案:D 字符串的format()格式。 第2题 下列的程…

PostgreSQL基础入门

为什么选择PostgreSQL 功能更全面&#xff1a;PGSQL的功能更加全面&#xff0c;支持开窗函数、物化视图、分区表、json等类型&#xff0c;MySQL8以上支持开窗函数、分区表、json等&#xff0c;但物化视图仍不支持。高可用&#xff1a;PG更适合分布式环境&#xff0c;如流复制、…

pychon/PIL/opencv/json学习过程中遇到的问题

1. 使用PIL.Image读取图片 注意&#xff1a;pytorch中对图像预处理是transforms的输入必须是PIL格式的文件&#xff0c;使用cv2读取的图片就按照第二条的代码处理&#xff08;3通道合并、归一化处理&#xff09; from PIL import Image img Image.open("test1.jpg"…

TensorFlow: An open-source software library for Machine Intelligence

Google开源的机器学习软件包 项目主页:https://www.tensorflow.org/Github主页:GitHub - tensorflow/tensorflow: An Open Source Machine Learning Framework for Everyone主要版本:1.0(当前最新版本),0.12.0开源协议:Apache 2.0TensorFlow™ 是一个采用数据流图(data…

2023 年最新企业微信官方会话机器人开发详细教程(更新中)

目标是开发一个简易机器人&#xff0c;能接收消息并作出回复。 获取企业 ID 企业信息页面链接地址&#xff1a;https://work.weixin.qq.com/wework_admin/frame#profile 自建企业微信机器人 配置机器人应用详情 功能配置 接收消息服务器配置 配置消息服务器配置 配置环境变量…

如何利用 cpolar 内网穿透技术实现 U8 用友 ERP 异地访问

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

【MATLAB源码-第75期】基于模拟退火算法(SA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

Hadoop原理,HDFS架构,MapReduce原理

Hadoop原理&#xff0c;HDFS架构&#xff0c;MapReduce原理 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c…

postswigger 靶场(CSRF)攻略-- 1.没有防御措施的 CSRF 漏洞

靶场地址&#xff1a; What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy (portswigger.net)https://portswigger.net/web-security/csrf 没有防御措施的 CSRF 漏洞 题目中已告知易受攻击的是电子邮件的更改功能&#xff0c;而目…

Oracle Primavera Unifier 23.10 新特征

根据官方的说法&#xff0c;Unifier 23.7 ~ 23.9 更多为对功能bug的修复&#xff0c;以下将对23.10进行重点介绍 Cost Sheets Cost Sheets Support Conditional Formatting Conditional formatting of table data is now supported in cost sheets with features such as ce…

基于注解的声明式事务

1.什么是事务 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2.事务的特性 A&#xff1a;原子性(A…

java Stream编程笔记

文章目录 Stream介绍什么是 Stream&#xff1f; Stream中间操作过滤操作&#xff08;filter&#xff09;映射操作&#xff08;map&#xff09;排序操作&#xff08;sorted&#xff09;截断操作&#xff08;limit 和 skip&#xff09; Stream 的终止操作forEach 和 peek聚合操作…

【pytorch深度学习】torch-张量Tensor

torch-张量Tensor 文章目录 torch-张量Tensor1. 张量Tensor 1. 张量Tensor torch.tensor() # 创建一个标量&#xff08;0维张量&#xff09; scalar_tensor torch.tensor(3.14) # 创建一个向量&#xff08;1维张量&#xff09; vector_tensor torch.tensor([1, 2, 3]) # 创…

【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)

目录 Ⅰ. 实践说明 0x00 十进制计数器 0x01 有限状态机&#xff08;FSM&#xff09; Ⅱ. 实践部分 0x00 4-bit 2421 十进制计数器 Ⅰ. 实践说明 0x00 十进制计数器 十进制计数器是一种以十进制运算的计数器&#xff0c;从 0 数到 9&#xff0c;然后返回 0 状态。由于它需…

青少年编程学习 等级考试 蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代&#xff0c;编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加&#xff0c;青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程&#xff0c;提升他们的技能和素质&#xff0c;博主结合自身多年从事青…