当前位置: 首页 > news >正文

Redis中的List类型

目录

List类型的命令

lpush

lpushx

rpush

lrange

lpop

rpop

lindex

linsert

llen

lrem

ltrim

lset

阻塞命令

阻塞命令的使用场景

1.针对一个非空的列表进行操作

2.针对一个空的列表进行操作

3.针对多个key进行操作.

内部编码

lisi类型的应用场景

存储(班级)信息

消息队列

分频道的消息队列

微博Timeline


列表(List)相当于是数组或者是顺序表.

结构示意图

约定最左侧的元素下标是0,redis的下标支持负数下标.

注意list内部的编码方式并非是一个简单的数组,而是更接近于双端队列.

列表中的元素是有序的,指的并不是其按照元素的数据大小进行排列,而是意味着当你向列表中插入元素时,它们会按照插入的顺序进行排序(比如尾插abc,得到的列表也是abc),并且每个元素都有一个关联的索引值来表示其位置。

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

List类型的命令

lpush

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

LPUSH key element [element ...]
返回的是插入后list的长度.

时间复杂度是O(N),N代表插入元素的个数.

lpushx

当key存在时,将一个或者多个元素从左侧放入到list中,不存在则直接返回.

x->exists.

LPUSHX key element [element ...]
返回的是插入后list的长度.
时间复杂度是O(N),N代表插入元素的个数.

rpush

将一个或者多个元素从右侧放入到list中,尾插.

RPUSH key element [element...........]
返回的是插入后list的长度.

时间复杂度是O(N),N代表插入元素的个数.

rpushx,类似与lpushx,尾插,不存在直接返回.

lrange

LRANGE key start stop
获取从start到end区间的所有元素,闭区间.下标是支持负数的.
返回的是指定区间的元素.

对于超出下标的情况,redis会尽可能的获取对应的内容.

lpop

LPOP key

从list左侧取出元素,即头删.

返回的是取出的元素或者nil.

rpop

从list右侧取出元素,尾删.

RPOP key
返回的是取出的元素或者nil.

lindex

LINDEX key index

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

时间复杂度是O(N),N指的是list中元素的个数.

返回的是取出的元素或者是nil.

linsert

LINSERT key <BEFORE | AFTER> pivot element

返回的是插入后list的长度.

时间复杂度是O(N).N代表列表的长度.

如果进行插入的时候,基准值有多个,redis是从左往右找,找到第一个符合基准值的位置.

llen

获取list的长度.

LLEN key

时间复杂度是O(1).

时间复杂度为什么是O(1):这是因为Redis将列表的长度存储在列表对象的内部数据结构中,并且在每次插入或删除元素时都会更新该长度。因此,当执行LLEN命令时,Redis可以直接返回列表的长度,无需遍历整个列表,所以时间复杂度是固定的,与列表的长度无关。

lrem

lrem key count element

count表示要删除的个数,element表示要删除的值.

 当count>0时表示从左向右删除元素.

当count<0时表示从右向左删除元素.

当count=0时表示删除全部指定元素.


ltrim

LTRIM key start stop

保留start和stop之间区间内的元素,区间外面的元素就直接被删除了.

lset

LSET  key index element

根据下标修改元素.

时间复杂度:O(N).

如果下标越界会直接报错.


阻塞命令

blpop key [key.....] timeout

brpop key [key.....] timeout

blpop和brpop是lpop和rpop的阻塞版本.

相当于我们之前学习的阻塞队列一样.

当队列元素为满的时候,在往里插入元素会阻塞;当队列元素为空的时候,往外取元素也会阻塞.

redis只针对队列为空往外取的时候做了阻塞.因为redis中对于list什么时候为满没有明确的要求.

所以blpop和brpop.

blpop和brpop是lpop和rpop的阻塞版本,和对应的非阻塞版本的作用基本一致,除了:

1.在列表有元素的情况下,阻塞和非阻塞版本表现一致.但是如果列表为空,非阻塞版本会立即执行并返回nil,但阻塞版本会根据timeout阻塞一段时间,期间redis可以执行其他命令,但执行阻塞命令的客户端会表现为阻塞状态.

2.命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表可以弹出元素,命令立即返回.

3.如果多个客户端对一个键执行brpop或blpop,最先执行命令的客户端会得到弹出的元素.


阻塞命令的使用场景

1.针对一个非空的列表进行操作

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

2.针对一个空的列表进行操作

返回二元组并且显示阻塞时间.

3.针对多个key进行操作.


内部编码

之前的版本list的内部编码是ziplist(压缩列表)和linkedlist(链表).

和hash类型的类似,当元素个数过多的时候,ziplist会转换为linkedlist;当某个value过长的时候,ziplist也会转换为linkedList.

同样也存在两个配置项:list-max-ziplist-entries和list-max-ziplist-value.

而现在的版本list的内部编码只有一个quicklist.

quicklist相当于是结合了链表和压缩列表.

整体还是一个链表,但是链表的每一个节点是一个压缩列表.

每个压缩列表都不要太大,同时再把多个压缩列表通过链式结构的方式连接起来.


lisi类型的应用场景

存储(班级)信息

用list作为像数组这样的结构,来存储多个元素.

用mysql表示两个表,一个学生表一个班级表.

通过这样的表结构,可以很方便的实现查询指定班级中有哪些同学.

而redis中没有这么强调的查询功能,我们只能设置合适的键值对来实现对应的效果.

学生的个人信息用hash表示,而班级信息我们就可以使用list类型来表示.

通过classStudent:1来获取对应的学生id.


消息队列

redis阻塞消息的队列模型

在当前的场景下,如果列表为空,消费者就会阻塞等待,直到有了数据或者到了timeout时间.

谁先执行brpop命令,谁就可以先拿到新来的数据.

如果消费者不停的brpop,这样的设定就能构成一个轮询的效果.

分频道的消息队列

多个频道的场景非常常见,比如一个短视频,可以有一个频道来传输短视频数据,还可以有一个频道来传输弹幕数据,还可以有一个频道来传输点赞,转发和收藏的数据,可以有一个频道来传输评论数据.

设置成多个频道,就可以在某种数据发生问题的时候,不会对其他数据造成影响.


微博Timeline

1.每篇微博使用hash结构存储.

2.向用户的timeline添加微博.user:<uid>:myblogs作为键.

3.分页获取用户的timeline,例如获取用户1的10篇微博.

相关文章:

Redis中的List类型

目录 List类型的命令 lpush lpushx rpush lrange lpop rpop lindex linsert llen lrem ltrim lset 阻塞命令 阻塞命令的使用场景 1.针对一个非空的列表进行操作 2.针对一个空的列表进行操作 3.针对多个key进行操作. 内部编码 lisi类型的应用场景 存储(班级…...

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性&#xff0c;它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包&#xff0c;提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…...

DB-GPT介绍

DB-GPT介绍 引言DB-GPT项目简介DB-GPT架构关键特性私域问答&数据处理多数据源&可视化自动化微调Multi-Agents&Plugins多模型支持与管理隐私安全支持数据源 子模块DB-GPT-Hub微调参考文献 引言 随着数据量的不断增长和数据分析的需求日益增多&#xff0c;将自然语言…...

Java,面向对象,内部类

内部类的定义&#xff1a; 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff08;InnerClass&#xff09;&#xff0c;类B则称为外部类&#xff08;OuterClass&#xff09;。 内部类的使用场景: 类A只在类B中使用&#xff0c;便可以使用内部类的方法…...

唯一ID如何生成,介绍一下目前技术领域最常使用的几种方法

纵使十面大山&#xff0c;又如何&#xff0c;无妨… 概述 唯一ID&#xff08;Unique Identifier&#xff09;是在计算机科学和信息技术领域中用于标识某个实体或数据的唯一标识符。生成唯一ID的方法可以根据具体需求和应用场景的不同而有所不同。以下是一些目前技术领域中常用…...

【翻译】XL-Sum: Large-Scale Multilingual Abstractive Summarization for 44 Languages

摘要 当代的关于抽象文本摘要的研究主要集中在高资源语言&#xff0c;比如英语&#xff0c;这主要是因为低/中资源语言的数据集有限。在这项工作中&#xff0c;我们提出了XL-Sum&#xff0c;这是一个包含100万篇专业注释的文章摘要对的综合多样数据集&#xff0c;从BBC中提取&…...

配置OpenCV

Open CV中包含很多图像处理的算法&#xff0c;因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV&#xff0c;需要进行手动配置&#xff0c;下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…...

1-时间复杂度和空间复杂度

为了找到最适合当前问题而估量“算法”的评价s 时间复杂度空间复杂度执行效率&#xff1a;根据算法编写出的程序&#xff0c;执行时间越短&#xff0c;效率就越高占用的内存空间&#xff1a;不同算法编写出的程序&#xff0c;执行时占用的内存空间也不相同。如果实际场景中仅能…...

EtherCAT主站SOEM -- 3 -- SOEM之ethercatconfig.h/c文件解析

EtherCAT主站SOEM -- 3 -- SOEM之ethercatconfig.h/c文件解析 一 ethercatconfig.h/c文件功能预览&#xff1a;二 ethercatconfig.h/c 中主要函数的作用&#xff1a;2.1.1 ec_config_init(uint8 usetable) 和 ecx_config_init(ecx_contextt *context, uint8 usetable)&#xff…...

洗地机哪个品牌好?家用洗地机选购攻略

随着家用洗地机的普及和市场的广泛认可&#xff0c;进入洗地机行业的制造商也越来越多。在面对众多洗地机品牌时&#xff0c;消费者常常感到困惑&#xff0c;不知道如何选择。面对众多选择&#xff0c;选择有良好保障的知名洗地机品牌是明智之举。知名品牌在质量、售后服务等方…...

Java数组的定义与常用使用方法

目录 一.什么是数组 二.数组的创建及初始化 数组的创建 数组的初始化 动态初始化&#xff1a; 静态初始化&#xff1a; 【注意】 三.数组的使用 数组中元素访问 遍历数组 四.数组作为方法的参数 参数传基本数据类型 参数传数组类型(引用数据类型) 作为方法的返回…...

[计算机网络]认识“协议”

认识“协议” 文章目录 认识“协议”序列化和反序列化网络计算器引入Sock类设计协议编写服务端类启动服务端编写客户端类启动客户端程序测试 序列化和反序列化 在网络体系结构中&#xff0c;应用层的应用程序会产生数据&#xff0c;这个数据往往不是简单的一段字符串数据&…...

“Notepad++“ 官网地址

notepad官网下载地址&#xff1a;https://notepad-plus-plus.org/downloads/ npp.8.5.8.Installer.x64 本下载地址- https://download.csdn.net/download/namekong8/88494023 1. Fix session file data loss issue. 2. Fix Explorer context menu "Edit with Notepad…...

基于单片机的自动感应门设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、自动感应门设计的功能概述二、系统总体方案2.1系统的总体计划2.2元器件的介绍2.2.1单片机的…...

【密评】商用密码应用安全性评估从业人员考核题库(二十-完结)

商用密码应用安全性评估从业人员考核题库&#xff08;二十-完结&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 4640 单项选择题 在测评过程中遇到的PEM编码格式&#xff0c…...

Tigger绕过激活锁/屏幕锁隐藏工具,支持登入iCloud有消息通知,支持iOS12.0-14.8.1。

绕过激活锁工具Tigger可以用来帮助因为忘记自己的ID或者密码而导致iPhone/iPad无法激活的工具来绕过自己的iPhone/iPad。工具支持Windows和Mac。 工具支持的功能&#xff1a; 1.Hello界面两网/三网/无基带/乱码绕过&#xff0c;可以完美重启&#xff0c;支持iCloud登录、有消…...

VueX mapState、mapGetters、mapActions和mapMutaions 的使用

一、mapState和mapGetters 如果我们想要读取VueX中的State数据的Getters数据时&#xff0c;需要使用$store.state.数据名 和 $store.getters.数据名。 当我们State和getters中的数据多了以后&#xff0c;书写会很麻烦&#xff1a; 如果我们想要使用方便可以配置计算属性来简化…...

GMP标准的制药级层流细胞实验室核心要点

随着生物医药技术的飞速发展&#xff0c;制药行业对细胞疗法和细胞药物的需求日益增长。这推动了制药级层流细胞实验室的发展&#xff0c;其作为生物医药研发的关键基础设施&#xff0c;为制药企业提供了进行细胞培养、基因编辑、疫苗研发等工作的高效平台。本文就围绕GMP标准的…...

[免费] 适用于 Windows的10 的十大数据恢复软件

Windows 10是微软开发的跨平台和设备应用程序的操作系统。它启动速度更快&#xff0c;具有熟悉且扩展的“开始”菜单&#xff0c;甚至可以在多种设备上以新的方式工作。所以&#xff0c;Windows 10非常流行&#xff0c;我们用它来保存我们的照片、音乐、文档和更多文件。但有时…...

【halcon踩坑】区域为空但个数是1

背景 我在做瑕疵检测的时候&#xff0c;通过计算瑕疵区域的个数&#xff08;count_obj&#xff08;&#xff09;&#xff09;是否为0&#xff0c;来判断是否有瑕疵&#xff0c;如果不为0&#xff0c;那边我就会在图片上标记这个瑕疵的位置&#xff01; 但是有一次我发现明明没…...

第二十四章 BEV感知系列一(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 BEV感知系列是对论文Delving into the De…...

C++入门讲解第一篇

大家好&#xff0c;我是Dark Fire&#xff0c;终于进入了C的学习&#xff0c;我知道面对我的将是什么&#xff0c;就算变成秃头佬&#xff0c;也要把C学好&#xff0c;今天是C入门第一篇&#xff0c;我会尽全力将知识以清晰易懂的方式表达出&#xff0c;希望我们一起加油&#…...

项目实战:分页功能实战

1、在index.html添加点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"scr…...

AI人工智能大模型应用如何落地?

人工智能大模型是近年来人工智能领域的一项重要技术突破&#xff0c;其具备强大的计算能力和学习能力&#xff0c;能够处理大规模的数据和复杂的任务。 然而&#xff0c;要将人工智能大模型应用落地并实现实际价值&#xff0c;还需要克服一些挑战和问题。 首先&#xff0c;人…...

【优选算法系列】第一节.栈的简介(1047. 删除字符串中的所有相邻重复项和844. 比较含退格的字符串)

文章目录 前言一、删除字符串中的所有相邻重复项和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、比较含退格的字符串 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 …...

PostgreSQL逻辑管理结构

1.数据库逻辑结构介绍 2.数据库基本操作 2.1 创建数据库 CREATE DATABASE name [ [ WITH ] [ OWNER [] user_name ] [ TEMPLATE [] template ] [ ENCODING [] encoding ] [ LC_COLLATE [] lc_collate ] [ LC_CTYPE [] lc_ctype ] [ TABLESPACE [] tablespace ] [ CONNECTION L…...

高匿IP有什么作用

在互联网的蓬勃发展中&#xff0c;IP地址作为网络通信的基础&#xff0c;一直扮演着举足轻重的角色。而在诸多IP地址中&#xff0c;高匿IP地址则是一种特殊类型&#xff0c;其作用和价值在某些特定场合下尤为突出。那么&#xff0c;高匿IP地址究竟有哪些用处呢&#xff1f; 首先…...

Ubuntu Linux 23.10安装manimgl

1. 简介&#xff1a;manimgl是使用Python语言开发数学动画的一个库。用来创建数学动画。版本有很多&#xff0c;今天介绍manimgl&#xff0c;他要依赖OpenGL库。 2. 打开Shell命令行&#xff0c;连接上互联网。先安装opengl。 Shell>>> sudo apt install l…...

modesim verilog仿真验证基本流程(新建工程方式)

文章目录 环境搭建一、在modelsim里创建一个新的工程二、新建verilog设计文件及仿真激励文件三、仿真结果本文演示如何使用modelsim新建工程进行功能仿真。 环境搭建 本文中采用的modelsim版本如下: modelsim altera 10.3d一、在modelsim里创建一个新的工程 打开modelsim软…...

SpringBoot+AOP+自定义注解,优雅实现日志记录

文章目录 前言准备阶段1、数据库日志表2、自定义注解编写3、AOP切面类编写4、业务层4.1、Service 层&#xff1a;4.2 Service 实现层&#xff1a; 5、测试 前言 首先我们看下传统记录日志的方式是什么样的&#xff1a; DeleteMapping("/deleteUserById/{userId}") …...