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

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

相关文章:

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串&#xff08;这里的有序指的是强调数据排列顺序的重要&#xff0c;不是升序降序的意思&#xff09;&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;一个列表最多可以存储2^32-1个元素。在R…...

启动你的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;内容区域可以超过显…...

pandas 数据透视表

数据的透视表 数据的透视表&#xff1a; 使用函数 pivot_table( ) # 引用pandas import pandas as pd # pivot_table 使用 pd.pivot_table(data,values,index,aggfunc,fill_value,columns)参数1:data DataFrame的源数据参数2:values 要进行聚合操作的列参数3:index 进行分组…...

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

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

塔子哥Python算法基础课

【入门题】【输入篇1】AB Problem 题目描述&#xff1a; 给定两个整数 A 和 B&#xff0c;请计算它们的和并输出结果。 输入&#xff1a; 输入包含一行&#xff0c;包含两个整数 A 和 B&#xff0c;以空格分隔。 输出&#xff1a; 输出一行&#xff0c;包含一个整数&#…...

C++ 内存管理:深入理解 new、malloc、delete 和 free

引言 在 C 中&#xff0c;内存管理是一个非常重要的主题。正确使用动态内存分配和释放工具&#xff08;如 new、malloc、delete 和 free&#xff09;可以避免内存泄漏和程序崩溃。本文将深入探讨这些工具的区别&#xff0c;并介绍池化计数技术。 1. new 与 malloc 在动态申请内…...

基于互联网协议的诊断通信(DoIP)

1、ISO 13400标准和其他汽车网络协议标准有何不同&#xff1f; ISO 13400 标准即 DoIP 协议标准&#xff0c;与其他常见汽车网络协议标准&#xff08;如 CAN、LIN、FlexRay 等&#xff09;有以下不同&#xff1a; 通信基础与适用场景 ISO 13400&#xff1a;基于互联网协议&a…...

Android15 am命令 APP安装流程

一. PM 安装命令 使用命令 pm install -r xxx.apk pm命令安装app 会触发PackageManagerShellCommand 中runInstall()方法 frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java1. onCommand 函数: public int onCommand(String cmd…...

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

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

解锁网络防御新思维:D3FEND 五大策略如何对抗 ATTCK

D3FEND 简介 背景介绍 2021年6月22日&#xff08;美国时间&#xff09;&#xff0c;美国MITRE公司正式发布了D3FEND——一个网络安全对策知识图谱。该项目由美国国家安全局&#xff08;NSA&#xff09;资助&#xff0c;并由MITRE的国家安全工程中心&#xff08;NSEC&#xff…...

评估自动驾驶(AD)策略性能的关键指标

以下是针对自动驾驶&#xff08;AD&#xff09;策略性能评测指标的详细解读&#xff0c;结合其物理意义与工程价值&#xff1a; 核心评测指标分类与含义 1. 安全性指标&#xff08;Safety&#xff09; 动态碰撞率&#xff08;Dynamic Collision Ratio, DCR&#xff09; 定义&a…...

【领域】百度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…...

15. C++多线程编程-网络编程-GUI编程(如Qt)学习建议

1. 多线程编程 多线程编程允许程序同时执行多个任务&#xff0c;从而提高性能和响应速度。多线程常用于处理并发任务、提高CPU利用率、优化I/O操作等。 学习内容&#xff1a; 线程与进程的区别&#xff1a;理解线程和进程的基本概念及其区别。 线程的创建与管理&#xff1a;…...

【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 客户端。用户可以在自己电脑上搭建一个游戏…...

化学工业领域 - 基础化工、精细化工、煤化工极简理解

引入 基础化工、精细化工和煤化工是化学工业中的三个重要分支 它们在原料、产品、工艺、应用方面各有特点 一、基础化工&#xff08;Basic Chemical Industry&#xff09; 1、基本介绍 基础化工是指以石油、天然气、煤炭等为原料&#xff0c;生产大宗化学品和基础化学原料的…...

慢sql治理

一、慢SQL的定义与影响 慢SQL通常指的是执行时间超过合理阈值的SQL语句。这个阈值可以根据系统的实际情况进行设定&#xff0c;例如1秒或更长。慢SQL会导致系统响应时间延迟、资源占用增加、数据库连接池被占满、锁竞争增加等一系列问题&#xff0c;严重影响系统的稳定性和用户…...

基于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、上传安装包 用远程…...

Matlab 大量接单

分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB&#xff1a;熟练掌握MATLAB编程语言&#xff0c;能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…...

C++数据结构之数组(详解)

1.介绍 在C中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储相同类型的元素的集合。数组的元素在内存中是连续存储的&#xff0c;可以通过索引访问。下面将详细介绍C数组的相关内容。 2.数组的定义 数组的定义需要指定元素的类型和数组的大小。 type arrayName[a…...

AWS API Gateway灰度验证实现

在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…...

【Elasticsearch】Elasticsearch 的`path.settings`是用于配置 Elasticsearch 数据和日志存储路径的重要设置

Elasticsearch 的path.settings是用于配置 Elasticsearch 数据和日志存储路径的重要设置&#xff0c;这些路径在elasticsearch.yml配置文件中定义。以下是关于 Elasticsearch 的路径设置&#xff08;path.data和path.logs&#xff09;以及快照存储库配置的详细说明&#xff1a;…...

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没有影响。 其次&…...

Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程

Spring Boot拦截器&#xff08;Interceptor&#xff09;与过滤器&#xff08;Filter&#xff09;详细教程 目录 概述 什么是拦截器&#xff08;Interceptor&#xff09;&#xff1f;什么是过滤器&#xff08;Filter&#xff09;&#xff1f;两者的核心区别 使用场景 拦截器的典…...

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

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