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

news2024/12/22 22:07:11

文章目录

  • 前置知识
    • 列表类型的特点
  • 命令
    • 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.coloradmin.cn/o/1185623.html

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

相关文章

项目管理之如何出道(上)

前言 终于有时间更新了&#xff0c;大家是不是等不及了&#xff1f;那么书接上文&#xff0c;言归正传。 各位盆友&#xff0c;时间之轮已划入夜晚&#xff0c;尝试静下心来&#xff0c;思考一番。 Q1&#xff1a;是否曾经期待自己做一名项目经理&#xff0c;干了几年的coder甚…

MinGW32丢失dll文件

问题现象 执行Makefile的时候&#xff0c;突然出现这个提示&#xff0c;还有好几个类似的&#xff0c;提示我找不到dll文件&#xff0c;建议重装。 问题分析 重装软件 最直接的办法肯定是按照建议来重装&#xff0c;但是发现重装了好几次&#xff0c;不是缺这个就是缺那个&a…

每天一道算法题:17. 电话号码的字母组合

难度 中等 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” …

换服还是掀桌?哪条才是程序员的出路?

站在时代的风口浪尖&#xff0c;猪都能起飞。 大数据互联网正是时代的宠儿&#xff0c;IT行业的发展也正如火如荼。 人人都眼红程序员的高薪资&#xff0c;认为他们吃着时代的红利。 但是三百六十行&#xff0c;行行出社畜。”996“也好&#xff0c;甚至"007"也罢…

龙迅LT6911GXC,HDMI 2.1转4 PORT MIPI/LVDS支持分辨率高达8K30HZ

描述&#xff1a; LT6911GXC 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。 高清遥控器RX作为高清电脑中继器的上游&#xff0c;可与其他芯片的高清电脑TX合作&#xff0c;实现直译台功能。 对于 HDMI2.1 输入&#xff0c;LT6911GXC 可配置为 3/4 通道。 …

2023最新版JavaSE教程——第2天:变量与运算符

目录 一、关键字(keyword)二、标识符(identifier)三、变量3.1 为什么需要变量3.2 初识变量3.3 Java中变量的数据类型3.4 变量的使用3.4.1 步骤1&#xff1a;变量的声明3.4.2 步骤2&#xff1a;变量的赋值 四、基本数据类型介绍4.1 整数类型&#xff1a;byte、short、int、long4…

OmniFocus Pro for Mac(GTD时间管理软件) OmniFocus Mac版

OmniFocus Pro 3 for Mac 中文激活版是一款功能强大且灵活的 GTD 时间管理工具&#xff0c;可为您提供无干扰的环境&#xff0c;帮助您可以轻松地从邮件&#xff0c;消息&#xff0c;Safari 和任何其他第三方应用程序中安排任务&#xff0c;编写备注和剪辑信息。您可以快速轻松…

kotlin 基本语法

const val INFO "ZZZ is Success Result" fun main(){ var name: String? "zzz" name null name?.capitalize() //?问号的意思是如果name是null ,后面的方法不执行&#xff0c;如果name不是null&#xff0c;后面方法执行 var name: String? &q…

16 DNS协议详解

1、DNS的由来 很难记住网站的 IP 地址&#xff0c;因而也需要一个地 址簿&#xff0c;就是DNS 服务器。DNS 在日常生活中非常重要。每个人上网&#xff0c;都需要访问它&#xff0c;因此一旦DNS出现故障&#xff0c;是非常可怕的。因而&#xff0c;DNS 服务器&#xff0c;一定…

​软考-高级-信息系统项目管理师教程 第四版【第22章-组织通用治理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第22章-组织通用治理-思维导图】 课本里章节里所有蓝色字体的思维导图

一文解析嵌入式Linux系统自动构建框架

1、Buildroot 是什么&#xff1f; Buildroot 是 Linux 平台上一个开源的嵌入式 Linux 系统自动构建框架。整个Buildroot是由 Makefile 脚本和 Kconfig 配置文件构成的。你可以和编译Linux内核一样&#xff0c;通过 buildroot 配置&#xff0c;menuconfig 修改&#xff0c;编译…

HCIP---VLAN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一.VLAN概述 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种基于交换机和网络设备的划分技术&#xff0c;可以将不同区域的计算机、服务器和网络设…

推荐10个地推拉新app推广接单平台,都是一手单 官签渠道

地推拉新app推广接单平台是一种可以帮助APP获取新用户&#xff0c;并获得推广者获得佣金的平台。 这些平台通常提供各种类型的拉新任务&#xff0c;包括注册、下载、激活等&#xff0c;为APP应用方和推广者架起合作的桥梁。 本文将推荐10个优质的地推拉新app推广接单平台&…

JDBC(一)

第1章&#xff1a;JDBC概述 1.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上**&#xff0c;而持久化的实现过程大多通过各种…

b2b.ccb.com:443 需要你的凭据

忙活了一天&#xff0c;晚上回来准备查一下公户的最近的账单。因为昨天晚上熬夜重新做了电脑系统&#xff0c;就下载了建设银行的E路护航&#xff0c;一切安装就绪&#xff0c;准备进入企业网银时&#xff0c;被这些垃圾搞的系统及软件恶心到了&#xff0c;在此记录一下&#x…

底座(基座)模型是如何训练的?

我们把LLM的基本训练步骤分为两步&#xff0c;预训练和对齐&#xff1b;预训练我们非常熟悉&#xff0c;是bert-finetuning时代的基本原理&#xff0c;只不过LLM一般遵循自回归的逻辑&#xff0c;因此使用GPT模型的预训练方式&#xff1a;CLM&#xff08;具备因果关系的MLM&…

四、IPSec NAT穿越

IPSec NAT穿越 1、IPSec NAT穿越2、IPSec穿越NAT的处理3、IKEv2与NAT穿越3.1、NAT-T能力检测3.2、NAT网关发现3.3、NAT穿越的启用3.4、NAT-keepalive 4、IPSec NAT穿越示例&#xff08;网关之间存在NAT设备&#xff09;5、IPSec NAT穿越示例&#xff08;两侧存在NAT设备&#x…

2024年变革用户营运:新时代汽车厂商竞争规则探秘

从消费零售全领域的实践观察来看&#xff0c;仅仅凭借产品赢得竞争的时代已经过去&#xff0c;商业模式创新体现在越来越多企业向“产品服务”转变&#xff0c;向用户全生命周期需求挖掘转变。企业与消费者之间的关系从过去的一次性、断点式产品交易&#xff0c;转向持续性、覆…

【C++】STL 标准模板库 ① ( STL 简介 | STL 基本概念 | STL 主要内容 )

文章目录 一、STL 简介1、STL 概念2、STL 主要内容 二、STL 代码示例 一、STL 简介 1、STL 概念 C 语言 的 STL " 标准模板库 " 英文全称 " Standard Template Library " , STL 是一套强大的 C 库 , 其中包含了各种通用的 数据结构和算法 , 如 : 向量、列…

Python之Django

web应用程序 # Django框架是一款专门用来开发web应用的框架 # Web应用程序是一种可以通过浏览器访问的应用程序, B/S架构 案例&#xff1a;淘宝网、京东... # 应用程序有两种模式: C/S&#xff1a;客户端/服务器端程序&#xff0c;这类程序一般独立运行 B/S&#xff1a;…