【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)为队列

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试|Monkey基本参数介绍

说到android移动端稳定性测试&#xff0c;大家通常会想到android系统自动Monkey小猴子&#xff0c;通过Monkey命令模拟用户触摸点击屏幕、滑动、系统按键等操作来对设备上的app进行压力测试&#xff0c;来测试应用的稳定性和健壮性。 下面就说说monkey常用参数的用法~~ 1、-h…

Spring笔记(二)(黑马)(AOP面向切面编程)

01、AOP 简介 1.1 AOP的概念 AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的…

spdk用户态块层详解

先通过回顾内核态的通用块层来详细介绍SPDK通用块层&#xff0c;包括通用块层的架构、核心数据结构、数据流方面的考量等。最后描述基于通用块层之上的两个特性&#xff1a;一是逻辑卷的支持&#xff0c;基于通用块设备的Blobstore和各种逻辑卷的特性&#xff0c;精简配置&…

C# OpenCvSharp 去除文字中的线条

效果 中间过程效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent…

Spring面试题:(四)Spring Bean生命周期

Bean生命周期的阶段 实例化初始化完成销毁 IoC容器实例化Bean的流程 Bean定义 Bean工厂处理 反射实例化Bean 初始化 完成存储到单例池 Bean生命周期 Bean初始化话过程 属性填充aware接口BeanPostProcessor前置处理InitialzingBean接口初始化方法自定义init方法BeanPost…

Oracle(15)Managing Users

目录 一、基础知识 1、Users and Security 用户和安全 2、Database Schema 3、Checklist for Creating Users创建用户步骤 二、基础操作 1、创建一个用户 2、OS Authentication 操作系统身份验证 3、Dropping a User 删除用户 4、Getting User Information 获取用户信…

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

一、EMQX介绍 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 Windows版本的看这里: https://blog.csdn.net/xiaolong1126626497/article/details/1…

经验模态分解(Empirical Mode Decomposition,EMD)(附代码)

代码原理 EMD&#xff08;Empirical Mode Decomposition&#xff09;&#xff0c;也称为经验模态分解&#xff0c;是一种将非线性和非平稳信号分解成多个本征模态函数&#xff08;Intrinsic Mode Functions&#xff0c;简称IMF&#xff09;的方法。 EMD的基本原理是通过一系列…

掌动智能:UI自动化测试工具产品功能和优势

UI自动化测试工具是一种软件工具&#xff0c;用于模拟用户与应用程序的交互&#xff0c;检查应用程序的用户界面是否按预期工作。这些工具允许开发人员编写测试脚本&#xff0c;以模拟用户操作&#xff0c;例如点击按钮、输入文本、导航菜单等&#xff0c;然后验证应用程序的响…

哪款手机便签软件支持存储录音文件并支持转文字?

手机便签类软件带有存储录音转文字功能是比较实用的&#xff0c;很多人通常会整理很多录音类型的文件&#xff0c;录音文件整合在一起后&#xff0c;后续有需要可以逐条点开播放收听。尤其是在工作中&#xff0c;当领导说一些重点时&#xff0c;大家无法借助灵活的大脑来成功的…

如何判断被DDoS攻击

当网络和设备正常的情况下&#xff0c;服务器突然出现连接断开、访问卡顿、用户掉线等情况;服务器CPU或内存占用率出现明显增长;网络出入流量出现明显增长;网站或应用程序突然出现大量的未知访问;登录服务器失败或者登录过慢等等。以上是最为常见的服务器被 DDoS攻击后出现的几…

2.3 - 网络协议 - ICMP协议工作原理,报文格式,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ICMP协议 1、ICMP协议工作原理2、ICMP协议报文格式…

el-date-picker精确到分钟

0 效果 1 代码 使用format、value-format属性格式化即可 :clearable“false” // 取消删除图标 注意&#xff1a; format&#xff1a;“yyyy-MM-dd HH:mm” 小时默认是从00:00开始 format&#xff1a;“yyyy-MM-dd hh:mm” 小时默认是从12:00开始

【爬虫】Java爬虫爬取某招聘网站招聘信息

目录 前言 一、爬虫程序的基本架构 二、如何获取目标网站的页面内容 三、解析HTML页面&#xff0c;提取所需信息 四、代理IP的使用 五、完整代码 总结 前言 随着互联网的普及&#xff0c;越来越多的人开始关注网络上的招聘信息&#xff0c;而传统的求职方式愈发显得不够…

docker部署mysql

docker部署mysql Docker部署MySQL配置远程登录持久化数据创建容器时配置挂载卷后置配置挂载卷 Docker卸载MySQL部署特定版本mysql【出现1251错误】远程连接docker容器中的mysql8.0数据库时出现连接不上 Docker部署MySQL 要使用Docker部署MySQL&#xff0c;你可以使用官方的MyS…

伊朗黑客对以色列科技和教育领域发起破坏性网络攻击

导语 近期&#xff0c;以色列的高等教育和科技领域遭受了一系列破坏性的网络攻击。这些攻击始于2023年1月&#xff0c;旨在部署以前未记录的数据清除恶意软件。在最近的攻击中&#xff0c;攻击者试图窃取个人身份信息和知识产权等敏感数据。本文将介绍这些攻击的具体细节&#…

Go语言开发环境安装,hello world!

1. Go开发包SDK https://golang.google.cn/dl/&#xff08;国内也可以安装&#xff09; 根据自己电脑下载对应的安装包&#xff0c;我懒下载了msi安装 然后一路点确定安装Go 2.安装GoLand https://www.jetbrains.com/go/download/#sectionwindows 下载安装包 一路确定安装完…

大数据疫情分析及可视化系统 计算机竞赛

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…