Redis数据结构-List列表

1.List列表

列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表,获取指定的索引下标的元素等。列表事宜总比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发商有很多应用场景

1.1 List列表允许两端进行插入和删除操作

1.2列表类型的特点

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

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

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

2.常见命令

2.1 LPUSH

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

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

时间复杂度:只插入一个元素为O(1),插入多个元素为O(N),N为插入元素的个数

返回值:插入后list的长度

示例:

2.2 LPUSHX

在Key存在时,将一个或者多个元素从左侧插入(头插)到list中。不存在,直接返回0

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

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

返回值:插入后list的长度

示例:

2.3 RPUSH

将一个或者多个元素从右侧插入(尾插)到list中

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

时间复杂度:直插入一个元素为O(1),插入多个元素为O(N),N为插入元素个数

返回值:插入后list的长度

示例:

2.4 RPUSHX

在Key存在时,将一个或者多个元素从右侧插入(尾插)到list中

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

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

返回值:插入后list的长度

示例:

2.5 LRANGE

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

语法:LRANGE key start stop

时间复杂度:O(N)

返回值:指定区间的元素

示例:

当end大于list中的元素个数时, list会“尽力展示”

2.6 LPOP

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

语法:LPOP key

时间复杂度:O(1)

返回值:取出元素或者nil

示例:

2.7 RPOP

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

语法:RPOP key [count](从Redis6.2版本新加,count指要删除的元素个数)

时间复杂度:O(1)

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

Redis中的list是一个双向链表

搭配使用rpush和lpop,就相当于队列

搭配使用rpush和rpop,就相当于栈 

2.8 LINDEX

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

语法:LINDEX key index

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

返回值:取出的元素或者nil(下标非法时,返回nil)

示例:

2.9 LINSERT

在特定位置插入元素

语法:LINSERT key <BEFORE | AFTER> pivot element(pivot指的是元素,不是索引下标)

时间复杂度:O(1)

返回值:插入后的list长度,当pivot不存在时,返回-1

示例:

2.10 LLEN

获取list长度

语法:LLEN key 

时间复杂度:O(1)

返回值:list的长度

示例:

2.11 LTRIM

保留[start,stop]区间的元素,区间之外的元素全部删除

语法:LTRIM key start end

时间复杂度:O(N)

返回值:保留正确返回OK

2.12 LREM

从list中删除某制定元素制定次

语法:LREM key count element(count表示要删除的个数,element要删除的值)

时间复杂度:O(N),N是列表中元素的个数

注意:count>0,从左向右删除等于element的值count次

           count<0,从右向左删除等于element的值count次

           count=0,删除所有等于element的元素

返回值:删除元素的个数

2.13 LSET

将下标为index的元素设置为element,index越界会报错

语法:LSET  key index element

时间复杂度:O(N)

返回值:设置成功返回OK,index越界会报错

阻塞版本命令

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

1.在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会理解返回nil,但阻塞版本会根据timeout,阻塞一段时间(并不会对Redis服务器产生负面影响),期间Redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态

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

3.如果多个客户端同时对一个键执行pop,则最先执行命令的客户端会得到弹出的元素(单线程模型,不会出现线程安全问题)

2.14 BLPOP

LPOP的阻塞版本

语法:BLPOP key [key ...] timeout(timeout超时时间,Redis6可以使用小数)

时间复杂度:O(1)

注意:每个key对应一个list,如果这些list有任何一个非空,blpop都能够把这里的元素给获取到,立即返回,如果这些list都为空,此时就需要阻塞等待,等待其他客户端往这些list中插入元素

返回值:取出元素或者nil

示例:

2.15 BRPOP

RPOP的阻塞版本

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

时间复杂度:O(1)

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

示例:

3.List的内部编码

3.1 ziplist

ziplist(压缩列表):当列表中的元素小于list-max-ziplist-entries配置(默认为512个),同时列表中的每个元素的长度都小于list-max-ziplist-value配置(默认64字节)时,Redis会选择用ziplist来作为列表的内部编码实现来减少内存消耗

3.2 linkedlist

linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现

4.List的典型使用场景

4.1 Redis阻塞消息队列模型

Redis可以使用lpush和brpop命令组合实现经典的阻塞式生产者-消费者模型队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式地从队列中“争抢”队首元素。通过多个客户端来保证消费的负载均衡和高可用性

 Redis分频道的消息队列

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

多个列表/频道,这种场景非常常见的。日常使用的一些程序如抖音等,可以使用一个通道,来传输视频,还可以使用一个通道,来传输弹幕,还可以有一个通道(频道),来传输点赞,转发,收藏数据,还可以有频道来传输评论,数据......多个频道,就可以在某种数据发生问题的时候不会对其他数据造成影响(解耦合)

4.2 微博Timeline

每个用户都有属于自己的Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素

伪代码:

keylist = lrange user:1:myblogs 0 9
for key in keylist{hgetall key
}

此方案仍存在问题:

1.1+n问题。即如果每次分页获取的微博个数较多,需要执行多次hgetall操作,此时可以考虑使用pipline(流水线)模式批量提交命令,或者微博不采用哈希类型,而是使用序列化的字符串类型,使用mget获取

2.分裂获取文章时,lrange在列表两端的表现较好,但是获取列表中间的元素表现较差(时间复杂度为O(N)),此时可以考虑将列表拆分

4.3栈

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

4.4队列

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

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

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

相关文章

《论负载均衡技术在Web系统中的应用》审题技巧 - 系统架构设计师

软考论文写作框架 一、考点概述 本题考点主要围绕“负载均衡技术在Web系统中的应用”展开,旨在考察考生对负载均衡技术的理解、应用及项目管理经验。负载均衡技术是提升Web系统性能的关键手段,通过合理分配和分散系统负载,确保多个操作单元能够高效协同工作,从而提升系统…

Linux实操——在服务器上直接从百度网盘下载(/上传)文件

Linux Linux实操——在服务器上直接从百度网盘下载&#xff08;/上传&#xff09;文件 文章目录 Linux前言一、下载并安装bypy工具二、认证并授权网盘账号三、将所需文件转移至目的文件夹下四、下载文件五、上传文件六、更换绑定的百度云盘账户 前言 最近收到一批很大的数据&…

报错The default superclass, “jakarta.servlet.http.HttpServlet“(已经配置好tomcat)

报错报错DescriptionResourcePathLocationType The default superclass,“jakarta.servlet.http.HttpServlet”, according to the project’s Dynamic Web Module facet version (5.0), was not found on the Java Build Path. 解决办法&#xff1a; 根据错误信息&#xff0…

【UI设计——陕西红富士苹果海报分享】

陕西红富士苹果海报设计分享 为大家带来一款陕西红富士苹果的宣传海报设计。 海报以柔和的粉色为背景&#xff0c;营造出温馨的氛围。画面下方展示了色泽红润、形态饱满的红富士苹果&#xff0c;既有完整的果实&#xff0c;也有切开的剖面&#xff0c;直观呈现其诱人外观。 上…

题解 | 牛客周赛82 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 判断字符串第一个字符和第三个字符是否相等 import java.io.*; import java.math.*; import java.u…

vulkanscenegraph显示倾斜模型(5)-视景器准备

前言 本文在接着往下讨论视景器准备相关步骤。Vulkan相比opengl更底层,其提供了更底层的硬件控制、更高的性能以及更好的多线程支持,VSG 通过封装 Vulkan 的复杂性,提供了更简单易用的接口,同时保留了 Vulkan 的高性能和灵活性。它简化了 Vulkan 的初始化、渲染管线配置、资…

基金 word-->pdf图片模糊的解决方法

1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印]&#xff0c;其中打印机选择pdf阅读器&#xff0c;例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像]&#xff0c;将所有的采样、压缩均设置为 关闭。点击[另存为]&#xff0c;保存为 基金报告…

基于RKNN的嵌入式深度学习开发(2)

上一个章节我们介绍的RKNN模型的模型转换和模型的推理&#xff0c;这一章节我们将介绍模型的量化和评估部分。 2.3 RKNN模型的量化 量化就是将浮点转换为定点运算的过程&#xff0c;或者训练后由rknn来量化。量化模型使用较低精度&#xff08;如int8/uint8/int16&#xff09;保…

单一职责原则(设计模式)

目录 问题&#xff1a; 定义&#xff1a; 解决&#xff1a; 方式 1&#xff1a;使用策略模式 示例&#xff1a;用户管理 方式 2&#xff1a;使用装饰者模式 示例&#xff1a;用户操作 方式 3&#xff1a;使用责任链模式 示例&#xff1a;用户操作链 总结 推荐 问题&a…

Java 8 到 Java 17 主要新特性

Java 8 到 Java 17 是 Java 语言的多个重要版本&#xff0c;其中每个版本都引入了新的特性和改进。下面是 Java 8 到 Java 17 中主要的新特性概览。 Java 8 新特性 1. Lambda 表达式 Lambda 表达式是 Java 8 的一个重要特性&#xff0c;它使得 Java 支持函数式编程&#xff…

Qt 中signals和slots、Q_SIGNAL和Q_LOT、Q_SIGNALS和Q_SLOTS的区别和使用

Qt 中signals和slots、Q_SIGNAL和Q_SLOT、Q_SIGNALS和Q_SLOTS的区别和使用 1.signals和slots 信号和槽函数需要在类的声明中明确声明。信号需要使用signals关键字&#xff0c;而槽函数可以使用slots关键字&#xff08;虽然在现代Qt中&#xff0c;槽函数也可以直接作为普通成员…

【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器- 2.1 Chrome架构:仅仅打开了1个页面,为什么有4个进程?

https://time.geekbang.org/column/article/113513 2.1 Chrome架构&#xff1a;仅仅打开了1个页面&#xff0c;为什么有4个进程&#xff1f; 前置&#xff1a;基于Chrome浏览器学习浏览器的工作原理 原因&#xff1a; 因为 Chrome、微软的 Edge 以及国内的大部分主流浏览器…

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…

【Python 初级函数详解】—— 参数沙漠与作用域丛林的求生指南

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

夜天之书 #106 Apache 软件基金会如何投票选举?

近期若干开源组织进行换届选举。在此期间&#xff0c;拥有投票权的成员往往会热烈讨论&#xff0c;提名新成员候选人和治理团队的候选人。虽然讨论是容易进行的&#xff0c;但是实际的投票流程和运作方式&#xff0c;在一个成员众多的组织中&#xff0c;可能会有不少成员并不清…

【蓝桥】大小写转换

1、islower()和isupper() 1.1 islower()函数 定义&#xff1a;用于判断一个字符是否为小写字母&#xff08;即 ‘a’ 到 ‘z’&#xff09; 1.2 isupper()函数 定义&#xff1a;用于判断一个字符是否为大写字母&#xff08;即 ‘A’ 到 ‘Z’&#xff09; 1.3 基础用法 #incl…

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天&#xff0c;官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学&#xff0c;对这个技术并不陌生。 开源地址&#xff1a;https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…

2025.3.1面试总结

昨天面试了一家做路由器的公司&#xff0c;问的问题还是挺多的&#xff0c;比较全面&#xff0c;也有一定的深度&#xff0c;比较注重底层原理的实现。 下面是具体问题&#xff1a; 岗位&#xff1a;嵌入式软件工程师 自我介绍&#xff1b;&#xfeff;项目介绍&#xff0c;…

React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序

功能要求&#xff1a; 1、渲染评论列表 2、删除评论功能&#xff1a;只显示自己评论的删除按钮&#xff1b;点击删除按钮&#xff0c;删除当前评论&#xff0c;列表中不再显示。 3、渲染导航Tab&#xff08;最新 | 最热&#xff09;和其 高亮实现 4、评论排序功能实现&…

智能座舱介绍

目录 智能座舱智能座舱的核心技术组成车载信息娱乐系统(IVI)数字仪表盘与HUD(抬头显示)语音交互与AI助手多屏联动与场景化交互生物识别技术智能座舱的发展趋势沉浸式体验情感化与个性化多模态交互融合车联网(V2X)生态扩展应用场景挑战与未来硬件系统软件系统关键技术智能…