Redis数据结构-List列表

news2025/4/7 20:40:29

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.coloradmin.cn/o/2308993.html

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

相关文章

启动你的RocketMQ之旅(三)-Producer启动和发送流程(上)

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final。 &#x1f4dd;个人主页&#xff1a; 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一…

Unity UGUI SuperScrollView介绍

先铺垫一下ScrollView Unity中常用的ScrollView 是 Unity 中的一个常见 UI 组件&#xff0c;主要用于创建可滚动的视图。当内容超过其显示区域时&#xff0c;ScrollView 可以让用户通过滚动查看全部内容。它通常包含一个显示区域和一个内容区域&#xff0c;内容区域可以超过显…

【STM32安全性研究】STM32F103RCT6固件读取

最近从飞哥那买了个stm32固件提取器,效果很好。下面记录对某产品主控STM32F103RCT6固件的提取过程,说明提取时的注意事项。 注意本文的目的仅用于stm32安全性研究,不提供涉及产品本身的内容,包括固件、软件等。 stm32固件提取可参考论坛https://www.aisec.fraunhofer.de/en…

SpringMVC学习(初识与复习Web程序的工作流程)(1)

目录 一、SpringMVC(框架)的简要概述。 &#xff08;1&#xff09;SpringMVC与Servlet。 &#xff08;2&#xff09;技术方向。 &#xff08;3&#xff09;最终学习目标。 二、Web程序的基本工作流程。 &#xff08;1&#xff09;工作流程。 <1>浏览器。前后端任务。 <…

【领域】百度OCR识别

一、定义 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象&#xff0c;现在我们常说的OCR一般指场景文字识别&#xff08;Scene Text Recognition&#xff0c;STR&#xff…

Docker 学习(一)

一、Docker 核心概念 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其所有依赖&#xff08;代码、运行时、系统工具、库等&#xff09;打包成一个轻量级、可移植的“容器”&#xff0c;实现 “一次构建&#xff0c;随处运行”。 1、容器&#xff08;Container…

【vscode-解决方案】vscode 无法登录远程服务器的两种解决办法

解决方案一&#xff1a; 查找原因 命令 ps ajx | grep vscode 可能会看到一下这堆信息&#xff08;如果没有大概率不是这个原因导致&#xff09; 这堆信息的含义&#xff1a;当你使用 vscode 远程登录服务器时&#xff0c;我们远程机器服务端要给你启动一个叫做 vscode serv…

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…

基于SpringBoot的美妆购物网站系统设计与实现现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

Redis 实战篇 ——《黑马点评》(下)

《引言》 &#xff08;下&#xff09;篇将记录 Redis 实战篇 最后的一些学习内容&#xff0c;希望大家能够点赞、收藏支持一下 Thanks♪ (&#xff65;ω&#xff65;)&#xff89;&#xff0c;谢谢大家。 传送门&#xff08;上&#xff09;&#xff1a;Redis 实战篇 ——《黑马…

蓝桥杯自我复习打卡

总复习&#xff0c;打卡1. 一。排序 1。选段排序 太可恶了&#xff0c;直接全排输出&#xff0c;一个测试点都没过。 AC 首先&#xff0c;这个【l,r】区间一定要包含p,或者q&#xff0c;pq一个都不包含的&#xff0c;[l,r]区间无论怎么变&#xff0c;都对ans没有影响。 其次&…

Java零基础入门笔记:(6)面向对象

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

【MongoDB】在Windows11下安装与使用

官网下载链接&#xff1a;Download MongoDB Community Server 官方参考文档&#xff1a;https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型&#xff0c;其他默认 注意&#xff0c;此选…

deepseek使用记录18——文化基因美食篇

子篇&#xff1a;薪火相传的味觉辩证法——从燧人氏到预制菜的文化突围 一、石器时代的启蒙&#xff1a;食物探索中的原始辩证法 在贾湖遗址的陶罐残片上&#xff0c;碳化稻米与蜂蜜的结晶层相互交叠&#xff0c;这是9000年前先民对"甘"与"饱"的首次辩证…

2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;五&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务1 &#xff1a;内存取证&…

在 Ansys Maxwell 中分析磁场

在 Ansys Maxwell 中分析磁场 分析磁场的能力对于理解电磁系统至关重要。Ansys Maxwell 为工程师提供了强大的工具&#xff0c;帮助他们探索磁场数据并从中提取有价值的见解。在本指南中&#xff0c;我将深入研究 Ansys Maxwell 中的几种基本技术和方法&#xff0c;以有效地分…

DeepSeek FlashMLA:用技术创新破解大模型落地难题

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列十四DeepSeek大模型技术系列十四》DeepS…